flask 可以通过 扩展 (装饰器) 来实现类似于 django 中间件的功能
类似于 django 的中间件, 在执行视图函数之前, 之后的执行某些功能
1 @App.before_first_request
执行一次, 第一次请求结束, 在第一批函数执行后 就不再执行(状态改为 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_filter()装饰器
@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()
来源: http://www.bubuko.com/infodetail-2826162.html