中間件是Django請求/響應(yīng)處理的掛鉤框架陌选。這是一個輕量級的“插件”系統(tǒng)蝉衣,用于全局改變Django的輸入或輸出。每個中間件組件負(fù)責(zé)執(zhí)行一些特定的功能稚疹。例如居灯,AuthenticationMiddleware使用會話將用戶與請求關(guān)聯(lián)起來祭务。
一内狗、中間件可以寫成如下所示的函數(shù):
我們按照函數(shù)的形式自定義一個日志中間件,用來統(tǒng)計請求到響應(yīng)的耗時义锥,并在響應(yīng)頭中返回柳沙,在應(yīng)用目錄下新建一個logger_middleware.py文件,如下:
接著激活中間件拌倍,請將其添加到settings.py的中間件列表中:
在中間件中赂鲤,每個中間件組件都由一個字符串表示:類或函數(shù)名的完整Python路徑。
Django安裝不需要任何中間件柱恤,中間件可以是空的数初,但強烈建議至少使用CommonMiddleware。
中間件的執(zhí)行是有順序的梗顺,中間件可以依賴于其他中間件泡孩。例如,AuthenticationMiddleware在會話中存儲經(jīng)過身份驗證的用戶寺谤;因此仑鸥,它必須在SessionMiddleware之后運行。
在請求階段变屁,在調(diào)用視圖之前眼俊,Django按照中間件中定義的順序自上而下應(yīng)用。官方解釋:可以將其視為洋蔥:每個中間件類都是一個“層”粟关,視圖位于洋蔥的核心疮胖。如果請求通過洋蔥的所有層(每個層都調(diào)用get_response將請求傳遞到下一層),一直傳遞到核心的視圖闷板,響應(yīng)將通過每一層以相反的順序返回获列。
如果其中一層中斷,則接下去的其他層包括視圖也不會看到請求或響應(yīng)蛔垢,響應(yīng)將僅通過請求傳入的層返回击孩。
測試一下:
二、中間件也可以寫成類
我們按照類的形式鹏漆,也自定義一個一樣的日志中間件:
在settings.py中加入中間件即可: