Flask的中間件的性質(zhì)丛晌,就是可以理解為在整個(gè)請求的過程的前后定制一些個(gè)性化的功能。
flask的中間件的實(shí)現(xiàn)案例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
print('視圖函數(shù)中')
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()
# 梳理一下 根據(jù)werkzeug我們可以知道 每次請求必然經(jīng)歷了app()
# 所以我們要查看Flask的源碼找到__call__方法
# 找到了__call__方法后發(fā)現(xiàn)執(zhí)行了return self.wsgi_app(environ, start_response)
# 然后flask里面所有的內(nèi)容調(diào)度都是基于這個(gè)self.wsgi_app(environ, start_response)携丁,這就是就是flask的入口
# 如何實(shí)現(xiàn)中間件呢可款? 原理上就是重寫app.wsgi_app拣挪,然后在里面添加上一些自己想要實(shí)現(xiàn)的功能佛吓。
# 首先分析 app.wsgi_app需要加括號(hào)執(zhí)行 所以我們把a(bǔ)pp.wsgi_app做成一個(gè)對象宵晚,并且這個(gè)對象需要加括號(hào)運(yùn)行
# 也就是會(huì)觸發(fā)這個(gè)對象的類的__call__()方法
# 1 那么就是app.wsgi_app=對象=自己重寫的類(app.wsgi_app) ,我們需要在自己重寫的類里面實(shí)現(xiàn)flask源碼中的app.wsgi_app,在實(shí)例化的過程把原來的app.wsgi_app變成對象的屬性
# 2 app.wsgi_app() =對象() = 自己重寫的類.call()方法
# 3 那么上面的代碼就可以理解了维雇,在自己重寫的類中實(shí)現(xiàn)了原有的__call__方法
梳理:
- 根據(jù)werkzeug我們可以知道 每次請求必然經(jīng)歷了app()
- 所以我們要查看Flask的源碼找到call方法
- 找到了Flask的call方法后發(fā)現(xiàn)執(zhí)行了return self.wsgi_app(environ, - start_response)
- flask里面所有的內(nèi)容調(diào)度都是基于這個(gè)self.wsgi_app(environ, start_response)淤刃,這就是就是flask的入口,也就是selef是app吱型,也就是app.wsgi_app(environ, start_response)為程序的入口逸贾。
- 如何實(shí)現(xiàn)中間件呢? 原理上就是重寫app.wsgi_app津滞,然后在里面添加上一些自己想要實(shí)現(xiàn)的功能铝侵。
- 首先分析 app.wsgi_app需要加括號(hào)執(zhí)行 所以我們把a(bǔ)pp.wsgi_app做成一個(gè)對象,并且這個(gè)對象需要加括號(hào)運(yùn)行触徐。
- 也就是會(huì)觸發(fā)這個(gè)對象的類的call()方法咪鲜。
實(shí)操理解:
1、app.wsgi_app=對象=自己重寫的類(app.wsgi_app)
提示:我們需要在自己重寫的類里面實(shí)現(xiàn)flask源碼中的app.wsgi_app,在實(shí)例化的過程把原來的 app.wsgi_app變成對象的屬性
2撞鹉、app.wsgi_app() =對象() = 自己重寫的類.call()方法
app.wsgi_app(實(shí)參) =對象(實(shí)參) = 自己重寫的類.call(實(shí)參)方法
/3疟丙、那么上面的代碼就可以理解了,在自己重寫的類中實(shí)現(xiàn)了原有的call方法鸟雏,并且重新調(diào)用了原有的app.wsgi_app