Flask--中間件

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容