10. Flask请求扩展
一、请求扩展与中间件
flask 可以通过 扩展(装饰器)来实现类似于django 中间件的功能
1. @app.before_first_request
类似Django中间件,在执行视图函数之前,之后执行默写功能
执行一次,第一次请求结束,在第一批函数执行后就不再执行(状态改为False)
@app.before_first_request
def before_first_request1():
print('before_first_request1')
2. @app.before_request: process_request
在视图函数执行前,按照顺序依次执行(列表顺序)
@app.before_request
def before_request1():
Request.nnn = 123
print('before_request1')
@app.before_request
def before_request2():
print('before_request2')
登录验证
@user.before_request
def check(*args,**kwargs):
if request.path == '/login':
return None
elif session.get('user_info'):
return None
else:
return redirect('/login')
3. @app.after_request: process_response
在视图函数执行后,按照反序依次执行(列表逆序)
@app.after_request
def after_request1(response):
print('before_request1', response)
return response
@app.after_request
def after_request2(response):
print('before_request2', response)
return response
注意:请求被 before_request 拦截后,所有的 response会执行;另外:扩展可以只对 单独的蓝图对象生效,也可以对全局的 app 都生效
4. @app.errorhandler(404) 定制错误信息
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'),404
5. @app.template_global()
@app.template_global()装饰器
def func(a,b,c) --->> 全局temlate使用 {{func(a,b,c)}}
@app.template_filter()装饰器
def func(a,b,c) --->> 全局temlate使用 {{a|filter(b,c)}} # 需要管道符
6. 根据flask的请求入口,实现类似中间件的操作
class Middleware(object):
def __int__(self,old_wsgi_app):
self.old_wsgi_app = old_wsgi_app
def __call__(self, environ, start_response):
print('before')
ret = self.old_wsgi_app(environ, start_response)
print('after')
return ret
if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()