Flask的中间件的性质,就是可以理解为在整个请求的过程的前后定制一些个性化的功能。
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__方法
梳理:
- 根据werkzeug我们可以知道 每次请求必然经历了app()
- 所以我们要查看Flask的源码找到call方法
- 找到了Flask的call方法后发现执行了return self.wsgi_app(environ, - start_response)
- flask里面所有的内容调度都是基于这个self.wsgi_app(environ, start_response),这就是就是flask的入口,也就是selef是app,也就是app.wsgi_app(environ, start_response)为程序的入口。
- 如何实现中间件呢? 原理上就是重写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()方法
app.wsgi_app(实参) =对象(实参) = 自己重写的类.call(实参)方法
/3、那么上面的代码就可以理解了,在自己重写的类中实现了原有的call方法,并且重新调用了原有的app.wsgi_app