首页 » 软件开发 » 「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截)

「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截)

萌界大人物 2024-07-23 18:59:02 软件开发 0

扫一扫用手机浏览

文章目录 [+]

七、Flask框架核心知识:

Blueprint(蓝图)模块化处理,拦截器(分全局和控制器),错误页面的定制(如:404、500等)。

Python的代码主要分三层:

「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截) 「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截) 软件开发
(图片来自网络侵删)
包(含有__init__.py的文件夹)模块(包下面的.py的源文件)类、函数、全局变量。

7.1、Blueprint 蓝图:

1、main.py文件

「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截) 「Python系列」Flask项目实战五之蓝图和拦截器技巧(拦截器蓝图全局模块拦截) 软件开发
(图片来自网络侵删)

if __name__ == '__main__':

# 引用模块文档demo.py

from controller.demo import

# 注册蓝图,才可以引用

app.register_blueprint(demo) app.run(port=8080, debug=True)

2、demo.py文件的蓝图使用:

from flask import Blueprint

demo = Blueprint('demo', __name__)

@demo.route('/demo')

#函数名称不能与全局变量名称一致

def my_demo():

return '这是另外一个模块中的页面'

7.2、拦截器:对接口请求进行预先处理,然后再交由控制器。
(中间关卡)

比如用户如果没有登录,则拦截器直接拦截请求,不会将请求转发给控制器。
进而实现对接口的权限控制。

在Flask中,拦截器主要有两种:

全局拦截器,应用于Flask实例(app)中,对所有经过当前系统的请求进行拦截检查。
全局拦截器,要设置好白名单,让无需检验的接口可以正常访问。
全局拦截器,由于会检查每一个请求,所以会导致性能的下降,尽量少量。

举例:#定义session @app.route('/sess') def sess(): #设置Session的内容:用户名、呢称、角色权限 session['islogin'] = 'true' session['username'] = 'woxy' session['nickname'] = '强哥' session['role'] = 'editor' return 'Done'

#针对app定义的全局拦截器 @app.before_request def before(): #若用户已经登录session['islogin']='true',则不拦截 url = request.path #获取当前访问的地址后面定义路由部分内容 #若/sess登录过,则后面可以通过,否则不能通过 if url == '/sess': pass

elif session.get('islogin') != 'true': return '你当前还没有登录,无法访问页面' else: pass

或者设置白名单列表:

from w3lib import url #针对app定义的全局拦截器 @app.before_request def before(): #所有静态资源(JS、Image、CSS等),必须设置为白名单 #登录或都跟用户权限要求相关的接口,必须放行 #或者设置一个列表,来管理白名单 #首先是路由接口列表 pass_list = ['/', '/reg', '/login', '/vcode', '/sess'] #资源列表接口 suffix = url.endswith('.png') or url.endswith('.jpg') or url.endswith('.css') or url.endswith('.js') if url in pass_list or suffix: pass elif session.get('islogin') != 'true': return '你当前还没有登录,无法访问页面' else: pass

2.模块拦截器,只针对某一个模块进行拦截,应用于Blueprint模块中。

即把拦截器代码放在相应模块的文件中,设置要拦截的路由

标签:

相关文章