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()
  • 相关阅读:
    国内的maven镜像
    Python Flask UnicodeDecodeError 编码错误解决
    关于Python的web框架
    SDL2+OpenGL (4)混合图像产生动态效果
    什么是OpenGL中的深度、深度缓存、深度测试?
    SDL2+OpenGL (3)纹理映射
    SDL2+OpenGL (2)绘制立体图形
    SDL2+OpenGL (1)绘制多边形
    SDL2中使用OpenGL绘图
    CodeBlocks16.01 MinGW32位 配置SDL2.0.4
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8541769.html
Copyright © 2011-2022 走看看