zoukankan      html  css  js  c++  java
  • Flask 的 请求扩展 与 中间件

    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()
  • 相关阅读:
    4815 江哥的dp题a
    CON1023 明明的计划
    5200 fqy的难题----2的疯狂幂
    [SCOI2005] 最大子矩阵
    1457 又是求和?
    2064 最小平方数
    vijos P1459车展
    1366 xth 的第 12 枚硬币
    1360 xth 的玫瑰花
    3223: Tyvj 1729 文艺平衡树
  • 原文地址:https://www.cnblogs.com/ExMan/p/9870708.html
Copyright © 2011-2022 走看看