flask中间件

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    print('视图函数中')
    return 'hello world'

class my_middle:

    def __init__(self,wsgi_app):
        self.wsgi_app = wsgi_app

    def __call__(self, *args, **kwargs):
        print('中间件的代码上')
        obj = self.wsgi_app( *args, **kwargs)
        print('中间件的代码下')

        return obj

if __name__ == '__main__':
   
    app.wsgi_app = my_middle(app.wsgi_app)
     # app.wsgi_app(environ, start_response)
    app.run()
    # 梳理一下 根据werkzeug我们可以知道 每次请求必然经历了app()
    # 所以我们要查看Flask的源码找到__call__方法
    # 找到了__call__方法后发现执行了return self.wsgi_app(environ, start_response)
    # 然后flask里面所有的内容调度都是基于这个self.wsgi_app(environ, start_response),这就是就是flask的入口
    # 如何实现中间件呢? 原理上就是重写app.wsgi_app,然后在里面添加上一些自己想要实现的功能。
    # 首先分析  app.wsgi_app需要加括号执行  所以我们把app.wsgi_app做成一个对象,并且这个对象需要加括号运行
    # 也就是会触发这个对象的类的__call__()方法
    # 1 那么就是app.wsgi_app=对象=自己重写的类(app.wsgi_app) ,我们需要在自己重写的类里面实现flask源码中的app.wsgi_app,在实例化的过程把原来的app.wsgi_app变成对象的属性
    # 2         app.wsgi_app() =对象() = 自己重写的类.call()方法
    # 3         那么上面的代码就可以理解了,在自己重写的类中实现了原有的__call__方法

 参考链接:https://blog.csdn.net/lipenghandsome/article/details/104998512

原文地址:https://www.cnblogs.com/wzy23/p/13540618.html