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()
  • 相关阅读:
    IE不支持 ES6 Promise 对象的解决方案
    微信小程序使用阿里图标
    IE浏览器 ajax传参数值为中文时出现乱码的解决方案
    一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
    常见的一些浏览器兼容问题
    移动端rem设置(部分安卓机型不兼容)
    element ui el-menu样式调整
    原生login页面
    elemet ui去除table 样式
    项目上线
  • 原文地址:https://www.cnblogs.com/ExMan/p/9870708.html
Copyright © 2011-2022 走看看