Python-Django中介軟體執行順序
阿新 • • 發佈:2020-11-12
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執行結果