Django學習之中介軟體

2021-08-22 08:13:01 字數 2632 閱讀 7759

1>概念

中介軟體,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入

與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。

比如你想修改請求,例如被傳送到view中的httprequest物件,或者修改view返回的httpresponse物件,可能

你還想在view執行之前做一些操作,這些都可以通過中介軟體來實現。

2>中介軟體的四個方法

process_request

process_view

process_exception

process_response

當使用者發起請求的時候會依次經過所有的的中介軟體,這個時候的請求是process_request,最後到達views的函式中,

views函式處理後,在依次穿過中介軟體,這個時候是process_response,最後返回給請求者

我們也可以自己寫乙個中介軟體,這個類必須繼承middlewaremixin

上面就是正常情況下,中介軟體的執行過程,如上,它會按至上而下的順序依次執行各個中介軟體的process_request函式,

到檢視函式,返回響應時就 至下而上執行中介軟體的 process_response,注意函式的傳參,

注意中介軟體類並不一定非要process_response函式,但如果定義了這個函式,就必須加上返回值,一般是直接

return response,這個response就是檢視函式的返回值,當然,也可以自己寫返回值,這樣,就會替換之前檢視函式的

返回值。(這就類似乙個接力棒賽跑,因檢視函式執行完是一定有返回值的,所以,若中介軟體寫了對應函式,就必須接收,

這樣,下乙個中介軟體再接收傳遞,直到返回給請求體,若中介軟體寫了process_response但是不加返回值,接力棒就會斷在

這裡,最終送不到請求體而報錯。)

如果在process_request加上返回值,會怎樣?如下。

所以,當process_request有返回值,類似於這裡就產生了「接力棒」,程式就不往下走了,之後的中介軟體及檢視函式就

不再執行,而是當即「原路返回」,整個流程圖如下,

當最後乙個中間的process_request到達路由關係對映之後,返回到中介軟體1的process_view,然後依次往下,到達views

函式,最後通過process_response依次返回到達使用者

注意:process_view如果有返回值,會越過其他的process_view以及檢視函式,但是所有的process_response都還會執行

5>中介軟體應用例子,改寫下之前的登陸認證

試想如下場景,伺服器有100個path,有80個都需要登入驗證,如果每個檢視函式都加裝飾器,也挺繁瑣的,這個時候,

我們可以通過中介軟體來實現,就很輕鬆了,如下,之前認證例子改寫如下:

實現效果跟之前加裝飾器一樣,

注意:中介軟體的使用需結合實際場景,因為這個配置時全域性性的,使用不當則影響效能,試想一下,上面的認證例子,

如果該伺服器有100個path,但是需認證的是有10個,那還需要中介軟體做認證嗎?------這個時候加幾個裝飾器就解決了,

就沒必要用啦,因為大部分path都不必認證,如果加了中介軟體,那這些path每次訪問都會執行認證**,豈不是影響效能。

Django之中介軟體

django中的中介軟體 middleware 在django中,中介軟體其實就是乙個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中介軟體中相應的方法。在django專案的settings模組中,有乙個middleware classes變數,其中每乙個元素就是乙個中介軟體 ...

Django 之 中介軟體

使用裝飾器繞過中介軟體csrf token 從全域性角度改變 django 框架的輸入和輸出 不宜過多 不宜太複雜 middleware 模組名為 mymiddlewares,類名為 md1 mymiddlewares.md1 from django.utils.deprecation import...

django之中介軟體

1 什麼是中介軟體 顧名思義中介軟體就是介於request和response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入和輸出。因為改變的是全域性,所以需要謹慎使用,用不好反而會影響效能。如果你想修改請求,例如被傳送到view中的httprequest物件。或者你想修...