1. 程式人生 > 實用技巧 >Python-Django中介軟體執行順序

Python-Django中介軟體執行順序

Django 中介軟體作用:

  • 修改請求,即傳送到 view 中的 HttpRequest 物件。
  • 修改響應,即 view 返回的 HttpResponse 物件。
  • 中介軟體元件配置在 settings.py 檔案的 MIDDLEWARE 選項列表中。

    配置中的每個字串選項都是一個類,也就是一箇中間件。
  • 中介軟體中有五個鉤子函式

自定義中介軟體類的方法有:process_request 和 process_response

  • 返回值可以是 None、view_func(request) 或 HttpResponse 物件。

    • 返回值是 None 的話,按正常流程繼續走,交給下一個中介軟體處理。
    • 返回值是 HttpResponse 物件,Django 將不執行後續檢視函式之前執行的方法以及檢視函式,直接以該中介軟體為起點,倒序執行中介軟體,且執行的是檢視函式之後執行的方法。
    • c.返回值是 view_func(request),Django 將不執行後續檢視函式之前執行的方法,提前執行檢視函式,然後再倒序執行檢視函式之後執行的方法。
    • 當最後一箇中間件的 process_request 到達路由關係對映之後,返回到第一個中介軟體 process_view,然後依次往下,到達檢視函式。

  

#process_response例項
class NotFoundPageMiddleware(MiddlewareMixin):
    
def process_response(self,request,response): if response.status_code == 404: return redirect('/sess/404') return response #process_exception例項 class ViewMiddleware(MiddlewareMixin): #process_exception只會捕獲檢視函式中的異常,中介軟體中的錯誤函式 def process_exception(self,request,exception):
print(exception)

中介軟體執行順序

  • 多箇中間件的執行順序
  • 在請求檢視被處理前,中介軟體由上至下依次執行
  • 在請求檢視被處理後,中介軟體由下至上依次執行
    •   
    • #這邊兩個中介軟體看的清晰一點
      #
      中介軟體的執行順序: 根據中介軟體在settings檔案中定義的順序,從上到下執行. #process_request如果返回response, 那麼後續中間的所有方法都不再執行, 該response會經過當前中介軟體的process_response處理以前在這個中介軟體之前的process_response. class MyMiddleware1(MiddlewareMixin): #在檢視前執行 def process_request(self, request): print('my process request1') #在檢視之前執行 順序執行 def process_view(self,request,view_func,view_args,view_kwargs): print('my process view1') #錯誤觸發 # def process_template_response(self,request,response): # print('my template response1') # return response #基於響應,在檢視後執行 def process_response(self,request,response): print('my response1...') return response class MyMiddleware2(MiddlewareMixin): def process_request(self, request): print('my process request2') def process_view(self,request,view_func,view_args,view_kwargs): print('my process view2') # def process_template_response(self,request,response): # print('my template response1') # return response def process_response(self,request,response): print('my response2...') return response

      執行結果