您好,登錄后才能下訂單哦!
中間件是什么?
中間件是類似flask函數中鉤子函數的東西。可以在請求視圖函數前,或者視圖函數響應后處理某些事情。中間件對全部視圖都有效!
中間件一般會有兩個方法,process_request和process_response。分別用來處理請求到達視圖函數前,到達視圖函數后的事情。
編寫一個自定義的中間件
我們可以根據業務需要自己編寫一個中間件。在編寫中間件前,你需要讀一下django.utils.deprecation.MiddlewareMixin的源碼。
class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response
方法名 | 作用 | 返回值 | 備注 |
---|---|---|---|
__init__(self, get_response=None) | 服務器啟動(重啟)時執行一次 | 無 | -- |
process_request(self, request) | 在視圖執行之前調用 |
|
-- |
process_response(self, request, response) | 在視圖執行完之后調用 | 必須返回HttpResponse對象 | -- |
編寫自定義的中間件:
class My_middleware(MiddlewareMixin): def __init__(self,get_response=None): super().__init__(get_response) def process_request(self,request): """ 視圖函數前執行的,一旦這里有return將到達不了視圖函數 request是瀏覽器發過來的請求 """ print("視圖函數執行前") def process_response(self,request,response): """ 視圖函數后執行的 request是瀏覽器發過來的請求 response是視圖函數返回的響應 """ print("視圖函數執行后") # 因為你拿了視圖函數的response,就算處理的業務與response無關也要返回response return response
中間件的注冊
MIDDLEWARE = [ ... 'middlewares.My_middleware' # 寫上自己的路徑 ]
多個中間件的執行順序
!!!如果你定義了多個中間件,記得注意一下中間件擺在setting.py文件的位置:
例如:
先注冊中間件1,后注冊中間件2。
輸出結果是:
before 視圖(中間件1) before 視圖 2(中間件2) ==index== after 視圖 2(中間件2) after 視圖(中間件1)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。