1. 程式人生 > >Django元件 中介軟體

Django元件 中介軟體

中介軟體的概念

中介軟體是介於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 import
MiddlewareMixin 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 class
Md2(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出現錯誤時: