django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據本身的規則在合適的時機執行中間件中相應的方法。web
在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每個元素就是一箇中間件django
中間件中一共有四個方法:框架
process_request函數
process_viewurl
process_exceptionspa
process_response3d
process_request(self,request)code
process_response(self, request, response)中間件
當用戶發起請求的時候會依次通過全部的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者對象
在django中叫中間件,在其餘web框架中,有的叫管道,httphandle
上述截圖中的中間件都是django中的,咱們也能夠本身定義一箇中間件,咱們能夠本身寫一個類,可是必須繼承MiddlewareMixin
因此須要導入:from django.utils.deprecation import MiddlewareMixin
咱們在項目文件下建立一個Middle目錄,並在下面建立m1.py代碼例子以下:
#AUTHOR:FAN from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Row1(MiddlewareMixin): def process_request(self,request): print("中間件1請求") def process_response(self,request,response): print("中間件1返回") return response class Row2(MiddlewareMixin): def process_request(self,request): print("中間件2請求") # return HttpResponse("走") def process_response(self,request,response): print("中間件2返回") return response class Row3(MiddlewareMixin): def process_request(self,request): print("中間件3請求") def process_response(self,request,response): print("中間件3返回") return response
這樣當頁面發起請求的時候:後臺效果以下
可是若是當請求到達請求2的時候直接不符合條件返回,程序將吧請求直接發給中間件2返回,而後依次返回到請求者
用以下圖進行理解:
固然這是在django1.10的時候,在以前的版本的時候是直接返回到最後一箇中間件的response,而後向上依次返回,最後到發起請求
process_view(self, request, callback, callback_args, callback_kwargs)
咱們在m1.py文件中的的代碼進行更改:
#AUTHOR:FAN from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class Row1(MiddlewareMixin): def process_request(self,request): print("中間件1請求") def process_response(self,request,response): print("中間件1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件1view") class Row2(MiddlewareMixin): def process_request(self,request): print("中間件2請求") # return HttpResponse("走") def process_response(self,request,response): print("中間件2返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件2view") class Row3(MiddlewareMixin): def process_request(self,request): print("中間件3請求") def process_response(self,request,response): print("中間件3返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件3view")
高亮部分爲添加的內容,這樣運行以後效果以下:
咱們經過下圖進行分析上面的過程:
當最後一箇中間的process_request到達路由關係映射以後,返回到中間件1的process_view,而後依次往下,到達views函數,最後經過process_response依次返回到達用戶
process_exception(self, request, exception)
當views的函數中出現錯誤時,就會執行process_exception方法
若是在中間中添加了process_exception方法,工做圖示爲:
這樣當用戶發起請求的時候到達中間件3的process_request以後會到達urls路由關係映射這裏,若是匹配到了就會到中間件1的process_view,而後依次傳遞到中間件3的process_view,到達view函數。若是view函數中有報錯,則會從中間件3依次向上判斷每一箇中間件的process_exception是否能匹配到這個錯誤信息,若是匹配到則直接返回到最後一箇中間件,這裏即中間件3的process_response,而後依次返回到用戶,若是沒有匹配到這個錯誤則直接在頁面顯示錯誤信息。若是view函數中沒有錯誤,則到中間3即最後一箇中間件3的process_response,而後依次向上,傳到用戶
process_template_response(self,request,response)
只有當views函數中返回的對象中具備render方法,是就會直接process_template_responseprocess