中介軟體,就是在請求和處理請求中間所做的一些操作。在django中有request中介軟體,view中介軟體,response中介軟體,exception中介軟體等等。midddleware都需要在settings.py中的middleware_classes中進行定義。大致的流程如下:
當乙個請求來的時候,會將setting.py中的middlerware_classes中的中介軟體類名全部從頭到尾的執行一遍。對於每個中介軟體類名裡面都會有多個中介軟體的處理方法,如乙個中介軟體類名md1中有process_request方法,這是request中介軟體,process_response這是response中介軟體,process_view中介軟體,這是view中介軟體等等。
# 匯入中介軟體模組
from django.utils.deprecation import middlewaremixin
# 這是乙個中介軟體的類名,需要在settings.py檔案的middleware_classes中引入這個類名
class
md1(middlewaremixin)
:# 接收到客戶端資訊後立即執行(檢視函式之前)
defprocess_request
(self, request)
:print
("md1裡面的 process_request"
)# 返回到客戶端資訊前最後執行(檢視函式之後)
defprocess_view
(self, request, view_func, view_args, view_kwargs)
:print
("md1裡面的 process_view"
)return
none
# 返回到客戶端資訊前最後執行(檢視函式之後)
defprocess_response
(self, request, response)
:print
("md1裡面的 process_response"
)return response
在settings中定義
middleware =[,
]
如上定義以後,當任意乙個請求requst來了以後都會立刻去執行md1這個中介軟體類,然後順序的去執行裡面的process_request方法和process_view方法和process_response方法;
在這些方法中除process_response均可以返回none或者response,若返回none則繼續處理這個request,執行後續的中介軟體。若返回response則django不再執行任何其他中介軟體,立即返回該httpresponse;
process_response方法必須返回httpresponse 物件;這個response物件可以是傳入函式的那乙個原始物件(通常已被修改),也可以是全新生成的。
這個方法的呼叫時機在django接收到request之後,但仍未解析url以確定應當執行的view之前。django向它傳入相應的 httprequest 物件,以便在方法中修改。
process_request() 應當返回 none 或 httpresponse 物件.
如果返回 none , django將繼續處理這個request,執行後續的中介軟體, 然後呼叫相應的view.
如果返回 httpresponse 物件,django 將不再執行任何其它的中介軟體(無視其種類)以及相應的view。 django將立即返回該 httpresponse .
這個方法的呼叫時機在django執行完request預處理函式並確定待執行的view之後,但在view函式實際執行之前。
request
httprequest 物件。
callback
django將呼叫的處理request的python函式. 這是實際的函式物件本身, 而不是字串表述的函式名。
args
將傳入view的位置引數列表,但不包括 request 引數(它通常是傳入view的第乙個引數)
kwargs
將傳入view的關鍵字引數字典.
如同 process_request() , process_view() 應當返回 none 或 httpresponse 物件。
如果返回 none , django將繼續處理這個 request ,執行後續的中介軟體, 然後呼叫相應的view
如果返回 httpresponse 物件,django 將不再執行 任何 其它的中介軟體(不論種類)以及相應的view。django將立即返回
這個方法的呼叫時機在django執行view函式並生成response之後。
該處理器能修改response的內容;乙個常見的用途是內容壓縮,如gzip所請求的html頁面。
這個方法的引數相當直觀: request 是request物件,而 response 則是從view中返回的response物件。
process_response() 必須 返回 httpresponse 物件. 這個response物件可以是傳入函式的那乙個原始物件(通常已被修改),也可以是全新生成的。
這個方法只有在request處理過程**了問題並且view函式丟擲了乙個未捕獲的異常時才會被呼叫。這個鉤子可以用來傳送錯誤通知,將現場相關資訊輸出到日誌檔案, 或者甚至嘗試從錯誤中自動恢復。
這個函式的引數除了一貫的 request 物件之外,還包括view函式丟擲的實際的異常物件 exception 。
process_exception() 應當返回 none 或 httpresponse 物件.
如果返回 none , django將用框架內建的異常處理機制繼續處理相應request。
如果返回 httpresponse 物件, django 將使用該response物件,而短路框架內建的異常處理機制
Django 中介軟體
django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的執行過程如下圖所示 django在中介軟體中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下 def init self pa...
Django中介軟體
給檢視函式加裝飾器判斷使用者是否登入,把沒有登入的請求跳轉到登入頁面,我們通過給幾個特定檢視函式加裝飾器實現了這個需求,但是這樣做比較繁瑣,用django中的中介軟體會比較簡潔 什麼是中介軟體 中介軟體是幫助我們再檢視函式執行之前和執行之後都可以做一些額外的操作,它本質上就是乙個自定義類,類中定義了...
Django中介軟體
什麼是中介軟體?django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了django框架的健壯性。我們可以使用中介軟體,在django處理檢視的不同階段對輸入或輸出進行...