Django元件 中介軟體
阿新 • • 發佈:2018-11-01
中介軟體的概念
中介軟體是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎使用,用不好會影響到效能。
如果你想修改請求,例如被傳送到view中的HttpRequest物件。或者你想修改view返回的HttpResponse物件,這些都可以通過中介軟體來實現。
可能你還想在view執行之前做一些操作,這種情況就可以用middleware來實現。
自定義中介軟體
---process_request,process_response:
當用戶發請求的時候會依次經過所有的中介軟體,這個時候的請求process_request,最後到達views的函式中,views函式處理後,在一次穿過中介軟體,這個時候是process_response,最後返回給請求者
上述截圖中的中介軟體都是django中的,我們也可以自己定義一箇中間件,我們可以自己寫一個類,但是必須繼承MiddlewareMixin
需要匯入:
1 from django.utils.deprecation import MiddlewareMixin
in views:
1 def index(request): 2 3 print("view函式...") 4 return HttpResponse("OK")
in Mymiddlewares.py:
1 from django.utils.deprecation importMiddlewareMixin 2 from django.shortcuts import HttpResponse 3 4 class Md1(MiddlewareMixin): 5 6 def process_request(self,request): 7 print("Md1請求") 8 9 def process_response(self,request,response): 10 print("Md1返回") 11 return response 12 13 classMd2(MiddlewareMixin): 14 15 def process_request(self,request): 16 print("Md2請求") 17 #return HttpResponse("Md2中斷") 18 def process_response(self,request,response): 19 print("Md2返回") 20 return response
結果:
1 Md1請求 2 Md2請求 3 view函式... 4 Md2返回 5 Md1返回
流程圖:
---process_view:
1 process_view(self, request, callback, callback_args, callback_kwargs)
Mymiddlewares.py:
1 from django.utils.deprecation import MiddlewareMixin 2 from django.shortcuts import HttpResponse 3 4 class Md1(MiddlewareMixin): 5 6 def process_request(self,request): 7 print("Md1請求") 8 #return HttpResponse("Md1中斷") 9 def process_response(self,request,response): 10 print("Md1返回") 11 return response 12 13 def process_view(self, request, callback, callback_args, callback_kwargs): 14 print("Md1view") 15 16 class Md2(MiddlewareMixin): 17 18 def process_request(self,request): 19 print("Md2請求") 20 return HttpResponse("Md2中斷") 21 def process_response(self,request,response): 22 print("Md2返回") 23 return response 24 25 def process_view(self, request, callback, callback_args, callback_kwargs): 26 print("Md2view")
結果:
1 Md1請求 2 Md2請求 3 Md1view 4 Md2view 5 view函式... 6 Md2返回 7 Md1返回
process_view如果有返回值,會越過其他的process_view以及檢視函式,但是所有的process_response都還會執行.
---process_exception:
1 process_exception(self, request, exception)
Mymiddlewares.py:
1 class Md1(MiddlewareMixin): 2 3 def process_request(self,request): 4 print("Md1請求") 5 #return HttpResponse("Md1中斷") 6 def process_response(self,request,response): 7 print("Md1返回") 8 return response 9 10 def process_view(self, request, callback, callback_args, callback_kwargs): 11 12 # return HttpResponse("hello") 13 14 # response=callback(request,*callback_args,**callback_kwargs) 15 # return response 16 print("md1 process_view...") 17 18 def process_exception(self): 19 print("md1 process_exception...") 20 21 22 23 class Md2(MiddlewareMixin): 24 25 def process_request(self,request): 26 print("Md2請求") 27 # return HttpResponse("Md2中斷") 28 def process_response(self,request,response): 29 print("Md2返回") 30 return response 31 def process_view(self, request, callback, callback_args, callback_kwargs): 32 print("md2 process_view...") 33 34 def process_exception(self): 35 print("md1 process_exception...")
結果:
1 Md1請求 2 Md2請求 3 md1 process_view... 4 md2 process_view... 5 view函式... 6 7 Md2返回 8 Md1返回
流程圖:
當views出現錯誤時: