Flask的中間件的性質(zhì),就是可以理解為在整個(gè)請(qǐng)求的過(guò)程的前后定制一些個(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我們可以知道 每次請(qǐng)求必然經(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)中間件呢? 原理上就是重寫(xiě)app.wsgi_app,然后在里面添加上一些自己想要實(shí)現(xiàn)的功能。
# 首先分析 app.wsgi_app需要加括號(hào)執(zhí)行 所以我們把a(bǔ)pp.wsgi_app做成一個(gè)對(duì)象,并且這個(gè)對(duì)象需要加括號(hào)運(yùn)行
# 也就是會(huì)觸發(fā)這個(gè)對(duì)象的類(lèi)的__call__()方法
# 1 那么就是app.wsgi_app=對(duì)象=自己重寫(xiě)的類(lèi)(app.wsgi_app) ,我們需要在自己重寫(xiě)的類(lèi)里面實(shí)現(xiàn)flask源碼中的app.wsgi_app,在實(shí)例化的過(guò)程把原來(lái)的app.wsgi_app變成對(duì)象的屬性
# 2 app.wsgi_app() =對(duì)象() = 自己重寫(xiě)的類(lèi).call()方法
# 3 那么上面的代碼就可以理解了,在自己重寫(xiě)的類(lèi)中實(shí)現(xiàn)了原有的__call__方法
梳理:
- 根據(jù)werkzeug我們可以知道 每次請(qǐng)求必然經(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)中間件呢? 原理上就是重寫(xiě)app.wsgi_app,然后在里面添加上一些自己想要實(shí)現(xiàn)的功能。
- 首先分析 app.wsgi_app需要加括號(hào)執(zhí)行 所以我們把a(bǔ)pp.wsgi_app做成一個(gè)對(duì)象,并且這個(gè)對(duì)象需要加括號(hào)運(yùn)行。
- 也就是會(huì)觸發(fā)這個(gè)對(duì)象的類(lèi)的call()方法。
實(shí)操理解:
1、app.wsgi_app=對(duì)象=自己重寫(xiě)的類(lèi)(app.wsgi_app)
提示:我們需要在自己重寫(xiě)的類(lèi)里面實(shí)現(xiàn)flask源碼中的app.wsgi_app,在實(shí)例化的過(guò)程把原來(lái)的 app.wsgi_app變成對(duì)象的屬性
2、app.wsgi_app() =對(duì)象() = 自己重寫(xiě)的類(lèi).call()方法
app.wsgi_app(實(shí)參) =對(duì)象(實(shí)參) = 自己重寫(xiě)的類(lèi).call(實(shí)參)方法
/3、那么上面的代碼就可以理解了,在自己重寫(xiě)的類(lèi)中實(shí)現(xiàn)了原有的call方法,并且重新調(diào)用了原有的app.wsgi_app