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