1. 程式人生 > >Django的中介軟體

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裡註冊自己定義的中介軟體

由此總結一下:

  1. 中介軟體的process_request方法是在執行檢視函式之前執行的。
  2. 當配置多箇中間件時,會按照MIDDLEWARE中的註冊順序,也就是列表的索引值,從前到後依次執行的。
  3. 不同中介軟體之間傳遞的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上