Django 中間件

中間件。

  詳細介紹看: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。並將返回值返回給瀏覽器。

 

相關文章
相關標籤/搜索