中間件

  

圖片轉自:https://www.cnblogs.com/li-li/p/9892583.htmlhtml

django的生命週期:django

  1)client表明瀏覽器,瀏覽器內部爲咱們封裝了socket,Django的WSGI模塊也封裝了socket;分析:瀏覽器

  2)當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端,請求頭和請求體中會包含瀏覽器的動做(action),這個動做一般爲get或者post, 體如今url之中;服務器

  3)請求到達Django服務器後,首先,WSGI根據http請求協議進行解包並將請求信息封裝到HttpRequest對象中socket

  4)再依次通過Django的中間件的process_request方法(Django自帶7箇中間件,每一箇中間件都是一個類,類中必定有一個process_request方法);函數

  5)而後經過url控制器分發後,執行對應的視圖函數,視圖函數中能夠根據請求查詢相應的數據,獲得的數據能夠再傳給模板,通過render方法渲染後返回;post

  6)返回時再依次通過中間件的process_response方法;url

  7)再通過WSGI模塊,WSGI將按照http協議響應格式封裝響應信息,最後返回給客戶端(瀏覽器);spa

  8)客戶端瀏覽器接收到返回的數據,通過渲染後顯示給用戶;3d

 

中間件:

中間件在django中就是一個類, 是全局範圍內改變django輸入和輸出的. 

能夠自定義中間件必須繼承MiddlewareMixin, 還須要導入from django.utils.deprecation import MiddlewareMixin.

 

process_request(self,request):  ***

執行時間: 在視圖函數執行以前

參數: request ----> 跟視圖函數中是同一個

執行順序: 按照在setting裏的註冊順序 順序執行

返回值:

當返回的值是None的時候, 正常流程

當返回的值是HttpResponse對象時, 就會直接把這個HttpResponse對象返給瀏覽器, 因此再也不執行中間件文件中這個process_request後面的其餘的process_request方法; 也不會執行視圖函數; 直接執行當前的中間件的process_response方法

總結:

  1. 中間件process_request方法是在執行視圖函數以前執行的.

  2. 當配置多箇中間件的時候, 會按照在MIDDLEWARE中的註冊順序, 也就是列表的索引值, 從前到後依次執行

  3. 不一樣的中間件之間傳遞的request都是同一個對象

 

 

process_response(self,request,response)  ***

執行時間: 在視圖函數執行以後

參數:

request ----> 跟視圖函數中的是同一個

response ---> 視圖函數返回的HttpResponse對象.

執行順序: 按照在setting裏的註冊順序 倒序執行 也就是說第一個中間件的process_request方法首先執行,而它的process_response方法最後執行, 最後一箇中間件的process_request方法最後執行,而它的process_response方法最早執行

返回值: 是response對象, 必須是響應對象

 

process_view(self,request,view_func,view_args,view_kwargs)

執行時間: 在process_request執行以後, 在視圖函數執行以前,

參數:

request ----> 跟視圖函數中的是同一個

view_func---> 視圖函數

view_args---->視圖函數的位置參數

view_kwargs--->視圖函數的關鍵字參數

執行順序: 按照在setting裏的註冊順序 順序執行

返回值:

None 正常執行

HttpResponse對象: 不執行後面中間件的process_view方法, 不執行視圖函數, 直接執行最後一箇中間件中的process_response方法, 後面的正常執行

 

 

中間件的流程:

相關文章
相關標籤/搜索