乙個middleware的例子
import time
from django.urls import reverse
from django.utils.deprecation import middlewaremixin
class timeitmiddleware(middlewaremixin):
dewww.cppcns.comf process_request(self, request):
return
def process_view(self, request, func, *args, **kwargs):
if request.path != reverse('index'):
return none
start = time.time()
response = func(request)
costed = time.time() - start
print('process view: s'.format(costed))
return response
def process_excepttion(self, request, exception):
pass
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
return response
middleware中的函式有:
下面分別進行介紹:
process_request:
這是請求來到 middleware 中時講入的第乙個方法。一般情優下,我們以在這裡做一些校驗,比如使用者登入或者 http 程式設計客棧中是否有認證頭之類的驗證.這個方法可以有兩種返回值 httpresnonse 或者none,如果返回 httpresponse,那麼接下公尺的處理方法只會執行 process_response,其他方法將不會被執行。這裡需要注意的是,如果你的 middleware 是 settings 配置的 middleware 的第乙個,那麼剩下的 middleware 也不會被執行;如果返回 none,那麼 diango會繼續執行其他方法。
process_view:
這個方法是在 process_request 方法之後執行的,引數如上面**所示,其中 func 就是我們將要執行的 view 方法。因此,如果要統計乙個view的執行時間,可以在這裡做。它的返回值跟 process_request 一樣,是httpresponse 或者 none,其邏輯也一樣。如果返回 none,那麼 django 會幫你執行 view 函式,從而得到最終的 response。
process_template_response:
執行完上面的方法,並且 django 幫我們執行完 view,拿到最終的 response 後,如果使用了模板的 response (這是指通過 return render(request,'index.html',context={})方式返回的 response),就會來到這個方法中。 在這個方法中,我們可以對 response 做一下操作vwkosckxb,比如 content-type 設定,或者其他 header 的修改/增加。
process_response:
當所有流程都處理完畢後,就來到了這個方法。這個方法的邏輯跟 process_template_response是完全一樣的,只是後者是針對帶有模板的response的處理。
process_exception:
上面的處理方法是按順序介紹的,而這個方法不太一樣。只有在發生異常時,才會進入這個方法。哪個階段發生的異常呢?
可以簡單理解為在將要呼叫的 view **現異常(就是在process_view 的 func 函式中)或者返回的模板 response 在渲染時發生的異常。但是需要注意的是,如果你在process_viwww.cppcns.comew 中手動呼叫了 func,就像我們上面做的那樣,就不會觸發 process_exception 了。這個方法接收到異常之後,可以選擇處理異常,然後返回乙個含有異常資訊的 httpresponse,或者直接返回 none 不處理,這種情況下 django會使用自己的異常模板。
以上節選自《django企業開發實戰》 胡陽著。
本文標題: django中middleware中的函式詳解
本文位址:
Django框架之中介軟體MiddleWare
django中的中介軟體是乙個輕量級 底層的外掛程式系統,可以介入django的請求和響應處理過程,修改django的輸入或輸出。中介軟體的設計為開發者提供了一種無侵入式的開發方式,增強了django框架的健壯性。我們可以使用中介軟體,在django處理檢視的不同階段對輸入或輸出進行干預。中介軟體的...
Scrapy詳解之中介軟體(Middleware)
概述 每當scrapy進行乙個request請求時,這個方法被呼叫。通常它可以返回 1.none 2.response物件 3.request物件 4.丟擲ignorerequest物件 通常返回none較常見,它會繼續執行爬蟲下去。其他返回情況參考這裡 user agent中介軟體 from fa...
django中restframework巢狀序列化
問題 定義好了序列化器後有沒有遇到過想要序列化的資料表中有外來鍵的情況,我們需要的這個和外來鍵關聯的資料 model.py 報警表 class police models.model 報警型別 police models.charfield max length 50 開始範圍 begin mode...