Django的中介軟體
一:什麼是中介軟體:
中介軟體顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。
二:中介軟體有什麼作用:
如果你想修改請求,例如被傳送到view中的HttpRequest物件。 或者你想修改view返回的HttpResponse物件,這些都可以通過中介軟體來實現。可能你還想在view執行之前做一些操作,這種情況就可以用 middleware來實現。
三:自定義中介軟體:我們也可以自己定義一箇中間件,我們可以自己寫一個類,但是必須繼承MiddlewareMixin
中介軟體的主要方法 :
1, process_request(self,request) 和 process_response(sels,request,response)
2,process_view(self, request, callback, callback_args, callback_kwargs)
3,process_template_response(self,request,response)
4,process_exception(self, request, exception)
當用戶發起請求的時候會依次經過所有的的中介軟體,這個時候的請求時process_request,最後到達views的函式中,views函式處理後,在依次穿過中介軟體,這個時候是process_response,最後返回給請求者。
步驟:
1,from django.utils.deprecation import MiddlewareMixin
2,自定義中介軟體
3,在view中定義一個檢視函式
4, 第四步:在settings.py檔案的MIDDLEWARE裡註冊自己定義的中介軟體
由此總結一下:
- 中介軟體的process_request方法是在執行檢視函式之前執行的。
- 當配置多箇中間件時,會按照MIDDLEWARE中的註冊順序,也就是列表的索引值,從前到後依次執行的。
- 不同中介軟體之間傳遞的request都是同一個物件
多箇中間件中的process_response方法是按照MIDDLEWARE中的註冊順序倒序執行的,也就是說第一個中介軟體的process_request方法首先執行,而它的process_response方法最後執行,最後一箇中間件的process_request方法最後一個執行,它的process_response方法是最先執行。
process_view:
process_view(self, request, view_func, view_args, view_kwargs)
該方法有四個引數
request是HttpRequest物件。
view_func是Django即將使用的檢視函式。 (它是實際的函式物件,而不是函式的名稱作為字串。)
view_args是將傳遞給檢視的位置引數的列表.
view_kwargs是將傳遞給檢視的關鍵字引數的字典。 view_args和view_kwargs都不包含第一個檢視引數(request)。
Django會在呼叫檢視函式之前呼叫process_view方法。
它應該返回None或一個HttpResponse物件。 如果返回None,Django將繼續處理這個請求,執行任何其他中介軟體的process_view方法,然後在執行相應的檢視。 如果它返回一個HttpResponse物件,Django不會呼叫適當的檢視函式。 它將執行中介軟體的process_response方法並將應用到該HttpResponse並返回結果。
當最後一箇中間的process_request到達路由關係對映之後,返回到中介軟體1的process_view,然後依次往下,到達views函式,最後通過process_response依次返回到達使用者。
注意:process_view如果有返回值,會越過其他的process_view以及檢視函式,但是所有的process_response都還會執行。
process_exception:
process_exception(self, request, exception)
該方法兩個引數:
一個HttpRequest物件
一個exception是檢視函式異常產生的Exception物件。
這個方法只有在檢視函式中出現異常了才執行,它返回的值可以是一個None也可以是一個HttpResponse物件。如果是HttpResponse物件,Django將呼叫模板和中介軟體中的process_response方法,並返回給瀏覽器,否則將預設處理異常。如果返回一個None,則交給下一個中介軟體的process_exception方法來處理異常。它的執行順序也是按照中介軟體註冊順序的倒序執行。
process_template_response(self,request,response):
該方法對檢視函式返回值有要求,必須是一個含有render方法類的物件,才會執行此方法
class Test:
def __init__(self,status,msg):
self.status=status
self.msg=msg
def render(self):
import json
dic={'status':self.status,'msg':self.msg}
return HttpResponse(json.dumps(dic))
def index(response):
return Test(True,'測試')
csrf的禁用與啟用:
fbv模型:
cbv模型:
方式一:直接加在class類上
方式二:載入dispatch上