Flask 拦截器

登录实现后,有很多页面还没有进行设置登录要求,即使没有登录也可以到页面中来,当页面多了以后,每个页面都进行设置又非常繁琐,所以这里用到了 Flask 拦截器

相关资料源码来自编程浪子的Flask点餐小程序系统

web/interceptors/AuthInterceptor.py

import refrom application import app
from flask import request, redirect, gfrom common.libs.LogService import LogService
from common.libs.user.UserService import UserService
from common.models.User import User
from common.libs.UrlManager import UrlManager@app.before_request
def before_request():ignore_urls = app.config['IGNORE_URLS']ignore_check_login_urls = app.config['IGNORE_CHECK_LOGIN_URLS']path = request.pathuser_info = check_login()# 如果是静态文件就不要查询用户信息了pattern = re.compile('%s' % "|".join(ignore_check_login_urls))if pattern.match(path):returnif '/api' in path:returnuser_info = check_login()g.current_user = Noneif user_info:g.current_user = user_info# 加入日志LogService.addAccessLog()pattern = re.compile('%s' % "|".join(ignore_urls))if pattern.match(path):returnif not user_info:return redirect( UrlManager.buildUrl("/user/login"))return'''
判断用户是否已经登录
'''def check_login():cookies = request.cookiesauth_cookie = cookies[app.configp['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else Noneif auth_cookie is None:return False
# 0 是授权码,  1是uidauth_info = auth_cookie.split('#')if len(auth_info) !=2:return Falsetry:user_info = User.query.filter_by(uid=auth_info[1]).first()except Exception:return Falseif user_info is None:return Falseif auth_info[0] != UserService.geneAuthCode(user_info):return Falseif user_info.status != 1:return Falsereturn user_info

Config/base_setting.py设置无需拦截器拦截的url,防止login都被拦截了,出现死循环。

## 过滤url
IGNORE_URLS = ["^/user/login"
]IGNORE_CHECK_LOGIN_URLS =["^/static""^/favicon.ico"
]

        这段代码是一个Python的Flask应用程序中的配置项。其中定义了两个列表变量IGNORE_URLSIGNORE_CHECK_LOGIN_URLS,用于配置需要忽略的URL路径。

IGNORE_URLS列表中的正则表达式定义了一些URL路径,这些路径在进行登录检查时会被忽略。例如,“^/user/login"表示以”/user/login"开头的路径将被忽略。

IGNORE_CHECK_LOGIN_URLS列表中的正则表达式定义了一些URL路径,这些路径在进行登录检查时也会被忽略。例如,“^/static"表示以”/static"开头的路径将被忽略。

        这些配置项的作用是在进行登录检查时,排除一些特定的URL路径,使其不受登录检查的限制。

问题1: ^的作用是什么?

正则表达式中,^符号的作用是匹配字符串的开头位置。在给定的代码中,^被用于定义忽略的URL模式。具体来说,IGNORE_URLS列表中的正则表达式会匹配以"/user/login"开头的URL,而IGNORE_CHECK_LOGIN_URLS列表中的正则表达式会匹配以"/static""/favicon.ico"开头的URL。这样,当用户访问这些URL时,系统会忽略对用户登录状态的检查

问题2:pattern = re.compile('%s' % "|".join(ignore_check_login_urls))

这段代码的作用是将ignore_check_login_urls列表中的元素用竖线|连接起来,并将结果作为参数传递给re.compile()函数,生成一个 正则表达式模式对象 。这个模式对象可以用于匹配path字符串 是否 符合 其中 任意一个元素的模式。

例如,如果ignore_check_login_urls列表中有两个元素['/login', '/register'],那么生成的正则表达式模式对象就是re.compile('/login|/register')。这个模式对象可以用于判断path字符串是否匹配/login/register

问题3: 下段代码是什么意思?

auth_cookie = cookies[app.config['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else None

这段代码是用来获取名为auth_cookie的cookie的值。它首先检查cookies字典中是否存在键为app.config['AUTH_COOKIE_NAME']的项,如果存在,则将其值赋给auth_cookie变量;如果不存在,则将auth_cookie赋值为None

这段代码的作用是判断是否存在名为app.config['AUTH_COOKIE_NAME']的cookie,并将其值赋给auth_cookie变量。如果存在该cookie,则auth_cookie变量将保存该cookie的值;如果不存在该cookie,则auth_cookie变量将为None


def check_login():cookies = request.cookiesauth_cookie = cookies[app.configp['AUTH_COOKIE_NAME']] if app.config['AUTH_COOKIE_NAME'] in cookies else Noneif auth_cookie is None:return False
# 0 是授权码,  1是uidauth_info = auth_cookie.split('#')

问题4: 该段代码中auth_info是啥?

auth_info是一个列表,其中包含两个元素。第一个元素是授权码(auth_code),第二个元素是用户ID(uid)。

在这段代码中,首先检查名为AUTH_COOKIE_NAME的cookie是否存在于cookies字典中。如果存在,将其赋值给auth_cookie变量;否则,将auth_cookie设置为None

接下来,检查auth_cookie是否为None。如果是,表示未找到授权cookie,返回False

最后,使用split('#')方法将auth_cookie按照#分隔符拆分成两个元素,并将结果赋值给auth_info变量。

说实话到这我已经迷糊了,cookie是已经之前在web/controllers/user/User.py中定义好的

response.set_cookie( app.config['AUTH_COOKIE_NAME'], '%s#%s' % (UserService.geneAuthCode(user_info), user_info.uid), 60 * 60 * 24 * 120)   # 保存120填

这段代码将会设置一个名为app.config['AUTH_COOKIE_NAME']的cookie,其值为'%s#%s' % (UserService.geneAuthCode(user_info), user_info.uid),并且过期时间为120天

common/libs/user/UserService.py

class UserService():@staticmethoddef geneAuthCode(user_info = None):   #user_info 是哪来的? 用函数时带的 geneAuthoCode(user_info)m = hashlib.md5()str = "%s-%s-%s-%s" % (user_info.uid, user_info.login_name, user_info.login_pwd, user_info.login_salt)m.update(str.encode("utf-8"))return m.hexdigest()

这段代码是一个静态方法,属于UserService类。它用于 生成用户的身份验证码。下面是对代码的详细解析:

  1. 首先,导入了hashlib模块,用于进行哈希操作。
  2. 然后,定义了一个静态方法geneAuthCode,该方法接受一个参数user_info,用于传入用户信息。
  3. 在方法内部,创建了一个hashlib.md5()对象,用于进行MD5哈希操作。
  4. 接下来,根据用户信息的不同属性,构建了一个字符串str,其中包含了用户的uidlogin_namelogin_pwdlogin_salt
  5. 使用m.update()方法,将字符串str进行UTF-8编码后更新到MD5对象中。
  6. 最后,使用m.hexdigest()方法,获取MD5对象的哈希值,并将其作为身份验证码返回。

这段代码的作用是根据用户的信息生成一个唯一的身份验证码,用于 用户身份验证 或 其他安全相关的操作。

可以按照以下步骤使用UserService类中的geneAuthCode方法生成用户认证码

  1. 导入UserService类:
    from UserService import UserService
  2. 创建UserService对象:
    user_service = UserService()
  3. 调用geneAuthCode方法生成用户认证码:
    user_info = # 获取用户信息
    auth_code = user_service.geneAuthCode(user_info)

    这样,你就可以使用  UserService类  中的  geneAuthCode方法  生成 用户认证码了。


问题5: 回归总结一下,cookie就是两个值,一个是用户认证码,一个是uid。 这两个值是什么样的呢?

response.set_cookie函数用于设置Cookie。app.config['AUTH_COOKIE_NAME']是Cookie的名称,'%s#%s' % (UserService.geneAuthCode(user_info), user_info.uid)是Cookie的值, 60 * 60 * 24 * 120是Cookie的过期时间(单位为秒)。

这个例子中,Cookie的值由两部分组成,用#符号分隔。第一部分是用户验证码,由UserService.geneAuthCode(user_info)生成。第二部分是用户的uid

以下是一个示例,展示如何生成 用户验证码uid

user_info = {'uid': 123,'username': 'example_user'
}auth_code = UserService.geneAuthCode(user_info)
uid = user_info['uid']print("用户验证码:", auth_code)
print("用户uid:", uid)

输出结果:

用户验证码: abcdefg
用户uid: 123

也就是说cookie是这样一个值  abcdefg#123


问题6: auth_info = auth_cookie.split('#') 中 auth_info是啥值 请给个案例

auth_info  是通过将auth_cookie字符串使用 "#" 进行分割后得到的一个  列表 。具体的值取决于auth_cookie的内容。下面是一个示例:

auth_cookie = 'abcd1234#12345'
auth_info = auth_cookie.split('#')
print(auth_info)

输出结果为:

['abcd1234', '12345']

auth_info是一个由授权码用户ID组成的列表。授权码在列表的索引0处,用户ID在列表的索引1处。


问题7: Exception是什么,有什么作用?

Exception是Python中的一个内置类,用于处理异常情况。在try-except语句中,当try块中的代码发生异常时,程序会跳转到对应的except块中执行异常处理代码。Exception类是所有异常类的基类,可以捕获任何类型的异常。通过捕获Exception类,可以处理所有可能发生的异常情况,确保程序的稳定性和可靠性。

Exception类的作用是提供了一种统一的异常处理机制,使得程序可以在出现异常时进行适当的处理,避免程序崩溃或产生不可预料的错误。通过捕获和处理异常,可以对异常情况进行适当的处理,例如输出错误信息、记录日志、回滚事务等。

在给定的代码中,try-except语句中的except块捕获了Exception异常,并返回False。这样做的目的是在发生异常时,返回一个特定的值,以便在调用该代码的地方进行进一步的处理或判断。

问题8: return False是怎么的一个值,在浏览器中会怎样显示?

return False是一个返回值,表示函数执行到这一步时返回了False。在浏览器中,如果这段代码是在后端服务器上执行的,那么浏览器不会直接显示返回值。相反,它会根据后端服务器的逻辑来处理返回值。可能会返回一个错误页面或者其他相应的信息。

如果你想在浏览器中显示返回值,你可以使用前端技术(如JavaScript)来处理后端返回的数据,并将其显示在浏览器上。这样你就可以根据返回值来决定在浏览器中显示什么内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例195:基于微信小程序的购物商城系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中,可以将【参数】放在【路由路径】中, 从而实现,同一个 路由,同一个组件,因路径参数不同,可以渲染出不同的内容。特点 : 1、当携带不同路径参数的路由相互跳转时&am…

【论文阅读】Realtime multi-person 2d pose estimation using part affinity fields

OpenPose:使用PAF的实时多人2D姿势估计。 code:GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR17 (Oral) paper:[1611.08050] Realtime Multi-Person 2D Pose Estima…

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

NLP论文阅读记录 - 02 | 2022 自动文本摘要方法:综合回顾

文章目录 前言0、论文摘要一、Introduction1.1文本摘要的要求1.2主要研究贡献 二.ATS的分类2.1基于没有。输入文档的数量2.2 基于总结方法2.3 基于输出摘要性质:2.4 基于摘要语言2.4.1 基于摘要算法2.5 基于摘要内容2.6 基于摘要类型2.7 基于概括域2.8 基于加工水平…

Your password does not satisfy the current policy requirements

密码策略问题异常信息: ERROR 1819 (HY000): Your password does not satisfy the current policy requirements1、查看 mysql 初始的密码策略, 输入语句 “ SHOW VARIABLES LIKE validate_password%; ” 进行查看 2.首先需要设置密码的验证强度等级&am…

如何查看官方文档(第410篇)

让自己更加值钱,考专业证,提升学历,提升专业技能。 一 让AI告诉你 如何查看官方文档(第410篇) 要查看MySQL官方文档的详细过程,可以按照以下步骤进行: 1. 打开MySQL官方文档的主页:https://dev.mysql.com/doc/refman/2. 在搜索框中输入您要查找的主题,并按Enter键。3.…

React Query 实战教程:在 React 中如何优雅的管理接口数据状态?

前言 如何通过Ajax或者Fetch优雅的请求后端接口,这是所有复杂前端项目都需要考虑处理的事情。在React项目中,有不少成熟的Hook能够让开发者管理整个请求过程中的数据和状态,例如 axios-hooks、use-http、react-query、swr甚至 ahook中提供的…

嵌入式开发——GD32F4的I2C查询

SCL SDA TXFRAME SMBA I2C0 PB6,PB8 PB7,PB9 PB4 PB5 I2C1 PB10,PF1,PH4 PF0,PH5,PB11,PC12,PB3 PF3,PH3,PB13 PF2,PH6,PB12 I2C2 PA8,PH7 PH8,PC9,PB4 PA10,PH10 PA9,PH9

删除数据后, redis 内存占用还是很高怎么办?

现象: reids 做了数据删除,数据量不大,使用 top 命令看,发现还是占用大量内存 原因: 1.redis 底层内存根据内存分配器分配,不会立刻释放 2.redis 释放的内存空间不是连续的,存在碎片 内存碎…

编译错误:C4056E type of input file ‘xxx‘ unknown

最近在Proteus上面进行仿真,将编译后的hex文件导入到电路图中,进行程序运行的时候,Proteus报了这么一个错误:Error: C4065E: type of input file Pian unknown 我上网一搜,好像与文件名称中存在空格有关,导…

百度飞桨文心生态成果最新披露:开发者达1070万 模型数超86万

12月28日,由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果,文心一言最新用户规模破1亿,截…

uniapp 新建组件

1. 新建文件夹 components 文件夹名称必须是 components &#xff0c;否则组件无法自动导入 2. 新建组件 3. 编辑组件 components/logo/logo.vue <template><img src"https://img.alicdn.com/imgextra/i1/O1CN01EI93PS1xWbnJ87dXX_!!6000000006451-2-tps-150-15…

BP神经网络详细原理,BP神经网络训练界面详解,基于BP神经网络的公司财务风险分类

目录 摘要 BP神经网络参数设置及各种函数选择 参数设置 训练函数 传递函数 学习函数 性能函数 显示函数 前向网络创建函数 BP神经网络训练窗口详解 训练窗口例样 训练窗口四部详解 基于BP神经网络的公司财务风险分类 完整代码下载链接:基于BP神经网络的公司财务风险分类(代码…

mac 安装pyaudio

直接安装pyaudio时报错 ERROR: Could not build wheels for PyAudio, which is required to install pyproject.toml-based projects需要先安装portaudio&#xff0c;打开终端执行&#xff1a; brew install portaudio再安装pyaudio成功 pip3 install pyaudioportaudio是一个…

Java中的锁(二)

锁从不同的角度有不同的分类&#xff0c;从线程是否需要锁住同步资源角度来分&#xff0c;可以分为&#xff1a;悲观锁和乐观锁。 一、悲观锁、乐观锁的定义 悲观锁就是我们常说到的锁。对于悲观锁来说&#xff0c;他总是认为每次访问共享资源时会发生冲突&#xff08;认为别的…

CNN实现对手写字体的迭代

导入库 import torchvision import torch from torchvision.transforms import ToTensor from torch import nn import matplotlib.pyplot as plt 导入手写字体数据 train_dstorchvision.datasets.MNIST(data/,trainTrue,transformToTensor(),downloadTrue) test_dstorchvis…

Windows实现MySQL5.7主从复制(详细版)

使用免安装版本&#xff08;官网下载地址&#xff09; 在Windows上安装两种MySQL服务并同时开启服务 1.下载配置 打开解压文件所在位置&#xff0c;就新建一个配置文件my.ini。 2.主库安装 主库的my.ini配置文件如下&#xff1a; [mysqld] #设置主库端口&#xff0c;注意须是…

uniapp开发移动端遇到的问题记录

1. 键盘弹起时页面整体上移问题 很常见但我解决过程中遇到了很多问题 我的键盘没有遮盖到输入框&#xff0c;但手机键盘弹起后&#xff0c;form部分会整体上移一点&#xff0c;并且底部的操作也会弹到键盘上方 网上写得很复杂&#xff0c;什么动态赋值高度balabala。看到有一…

英文vos安装,vos3000 web3.0

英文vos安装&#xff0c;vos3000英文软件工具安装&#xff0c;Web V3.0是一个安全且强大的批发 VOIP 计费解决方案&#xff0c;具有新的 Web 界面和无与伦比的令人惊叹的新功能。现在使用移动应用程序或网络浏览器控制您的 VOS3000 VOIP 计费服务器 yumsed -i "s|enabled…