中間件。
詳細介紹看:https://www.cnblogs.com/liwenzhou/p/8761803.htmlhtml
準備工做:
1:建立一個.py文件。如:my_middle.pydjango
2:在建立的py文件裏面寫自定義的中間件。如:M1,M2瀏覽器
3::在setting.py裏的MIDDLEWARE里加上自定的中間件。如:‘my_middle.M1’,‘my_middle.M2’,函數
中間件的運行順序:
建立M1,M2兩個中間件。url
在settings裏註冊順序:spa
'my_middle.M1',.net
'my_middle.M2',3d
1 from django.utils.deprecation import MiddlewareMixin 2 3 class M1(MiddlewareMixin): 4 def process_request(self,request): 5 print('m1的process_request') 6 def process_response(self,request,response): 7 print('m1的process_response') 8 return response 9 def process_view(self,request,callback,callback_arg,callback_kwargs): 10 print(callback) 11 print('m1的process_view') 12 class M2(MiddlewareMixin): 13 def process_request(self,request): 14 print('m2的process_request') 15 def process_response(self,request,response): 16 print('m2的process_response') 17 return response 18 def process_view(self,request,callback,callback_arg,callback_kwargs): 19 print(callback) 20 print('m2的process_view')
運行結果:code
m1的process_requesthtm
m2的process_request
<function middle_test at 0x0000000003F86620>
m1的process_view
<function middle_test at 0x0000000003F86620>
m2的process_view
視圖函數
m2的process_response
m1的process_response
其過程如圖所示:
說明:
process_request的返回值有兩個:None和HttpResponse。若是返回值是None則按原來的順序進行執行,入若是是HttpResponse則不會執行後面的中間件中的process_request,和process_view。直接從該中間件的process_response執行。並將返回值返回給用戶。
process_response只能返回HttpResponse對象,這裏返回的是response。
process_view有4個參數
request:請求相關的內容。
callback:是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱做爲字符串。)
callback_args是將傳遞給視圖的位置參數的列表.
callback_kwargs是將傳遞給視圖的關鍵字參數的字典。 callback_args和callback_kwargs都不包含第一個視圖參數(request)。
ps:後面三個參數callback這個名字是能夠改變的。
process_view有2個返回值None和HttpResponse。當返回值是None時,按原來的順序執行不作改變。入若是是HttpResponse,則不會執行後面的中間件的process_view,直接執行process_response(不是從當前中間件的process_response執行,是從第一個執行)。
process_exception(self,request,exception):是在執行試圖函數以後process_response以前執行。在視圖函數沒有異常時不執行。視圖函數有異常時才執行。執行的順序是按照註冊的順序的倒序執行。有2個返回值None和HttpResponse。當返回值是None時,按原來的順序執行不作改變。入若是是HttpResponse,如:
return HttpResponse(str(exception)),不會執行下面的process_exception,直接執行process_response。並將返回值返回給瀏覽器。