• flask框架(九): 请求和响应扩展以及中间件


    一:请求响应扩展

    # 每一次访问都执行
    # 注意请求之前按照顺序执行
    # 请求之后按照书写顺序倒序执行
    # 请求之前执行
    @app.before_request
    def process_request1(*args, **kwargs):
        print('process_request1')
        return None  # 如果不是return None 访问就被拦截了,就不会执行url对应的函数,但是会执行after_request装饰的函数
    
    
    @app.before_request
    def process_request2(*args, **kwargs):
        print('process_request2')
        return None
    
    
    # 访问结束后执行
    @app.after_request
    def process_response1(response):
        print('process_response1')
        return response
    
    
    @app.after_request
    def process_response2(response):
        print('process_response2')
        return response
    
    
    
    ##########################
    
    # 第一次请求的时候执行
    @app.before_first_request
    def first(*args, **kwargs):
        pass

    二:访问请求扩展的例子-登录验证

    # 使用扩展来解决登录问题,比用装饰器好,每次访问之前都执行
    @app.before_request
    def process_request(*args, **kwargs):
        if request.path == '/login':  # 设置白名单
            return None
        user = session.get('user_info')
        if user:
            return None
        url = url_for('l1')  # 根据别名生成url
        return redirect(url)

    三:其他小扩展

    # 定制错误信息,根据错误码定制
    @app.errorhandler(404)
    def error_404(arg):
        return '404错误'
    
    
    # 模板语言定制,定制模板方法
    @app.template_global()
    def ab(a1, a2):
        return a1 + a2
    
    
    # 在模板语言中调用{{ab(1,2)}}
    
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    
    
    # 在模板语言中调用{{1|db(2,3)}} |前面表示a1

    四:封装源码自定义中间件

    # 自定义中间件
    class Md(object):
        def __init__(self, old_wsgi_app):
            self.old_wsgi_app = old_wsgi_app
    
        def __call__(self, environ, start_response, *args, **kwargs):
            print('开始之前')
            ret = self.old_wsgi_app(environ, start_response) # 使用它原来的东西执行,在这基础上扩展执行之前和执行之后
            print('开始之后')
            return ret
    
    
    # 这个中间件通过如下调用:
    # if __name__ == '__main__':
    #   app.wsgi_app = Md(app.wsgi_app)
    #   app.run()
  • 相关阅读:
    GridControl 绑定非绑定列
    AutoMapper
    ABP-TaskEver 路线图
    Angular--页面间切换及传值的四种方法
    知行合一,止于至善
    AutoFac 依赖注入--问题集
    【入门】依赖注入(DI)-开始
    利用JAVA生成二维码
    sqlserver如何关闭死锁进程.
    Hadoop/HBase 配置snappy压缩
  • 原文地址:https://www.cnblogs.com/felixwang2/p/9267500.html
Copyright © 2020-2023  润新知