七、Flask框架核心知识:
Blueprint(蓝图)模块化处理,拦截器(分全局和控制器),错误页面的定制(如:404、500等)。
Python的代码主要分三层:

7.1、Blueprint 蓝图:
1、main.py文件

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模块中。
即把拦截器代码放在相应模块的文件中,设置要拦截的路由