Flask 的 请求扩展 与 中间件

 

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()