圖片轉自: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.
執行時間: 在視圖函數執行以前
參數: request ----> 跟視圖函數中是同一個
執行順序: 按照在setting裏的註冊順序 順序執行
返回值:
當返回的值是None的時候, 正常流程
當返回的值是HttpResponse對象時, 就會直接把這個HttpResponse對象返給瀏覽器, 因此再也不執行中間件文件中這個process_request後面的其餘的process_request方法; 也不會執行視圖函數; 直接執行當前的中間件的process_response方法
總結:
中間件process_request方法是在執行視圖函數以前執行的.
當配置多箇中間件的時候, 會按照在MIDDLEWARE中的註冊順序, 也就是列表的索引值, 從前到後依次執行
不一樣的中間件之間傳遞的request都是同一個對象
執行時間: 在視圖函數執行以後
參數:
request ----> 跟視圖函數中的是同一個
response ---> 視圖函數返回的HttpResponse對象.
執行順序: 按照在setting裏的註冊順序 倒序執行 也就是說第一個中間件的process_request方法首先執行,而它的process_response方法最後執行, 最後一箇中間件的process_request方法最後執行,而它的process_response方法最早執行
返回值: 是response對象, 必須是響應對象
執行時間: 在process_request執行以後, 在視圖函數執行以前,
參數:
request ----> 跟視圖函數中的是同一個
view_func---> 視圖函數
view_args---->視圖函數的位置參數
view_kwargs--->視圖函數的關鍵字參數
執行順序: 按照在setting裏的註冊順序 順序執行
返回值:
None 正常執行
HttpResponse對象: 不執行後面中間件的process_view方法, 不執行視圖函數, 直接執行最後一箇中間件中的process_response方法, 後面的正常執行
中間件的流程: