Django中間件middleware與reverse

在Django里面,中間件可以說是其的一大特點,中間件可以全局改變輸入(request)和輸出(response),用的好了,中間件會給我們帶來很大的便利。
在我們的Django項目的Settings.py文件,看到下面的MIDDLEWARE配置項,這些就是django默認自帶的一些中間件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
中間件一個有四個很重要的方法
  • process_request(self,request)
    1.request就是我們的request對象,沒啥好說的!
  • process_view(self,request,view_func, view_args, view_kwargs)
    1.request同上
    2.view_func:對應著我們訪問路由要執行的視圖函數
    3.view_args:對應著我們訪問路攜帶著的位置參數
    4.view_kwargs:對應著我們訪問路攜帶著的關鍵字參數
  • process_exception(self ,request, exception)
    1.request同上
    2.exception:當視圖函數出現異常所攜帶的參數
  • process_response(self,request,response)
    1.request同上
    2.response相應參數
上述四個函數如果都返回None,那么就會自動繼續執行,如果返回response對象,則不會繼續執行下面的部分!而會返回。

四個函數的執行順序

1.理想全部返回None的情況下:
  • 1.1用戶訪問地址,經過wsgi,然后進入process_request方法,正向按照中間件的順序依次進入;
  • 1.2執行完所有中間件process_request方法后,再次回到第一個中間件,正向按照中間件的順序執行process_view方法;
  • 1.3這部分由路由控制器選擇執行對應的視圖函數;
  • 1.4 由于沒有錯誤,按照中間件的倒序執行process_exception函數
  • 1.5按照中間件的倒序執行process_response函數再給客戶端返回結果;


    image.png
注:圖片來自:https://www.cnblogs.com/zdqc/p/11756119.html

2.存在返回http response對象的情況

  • 2.1如果是process_request有返回,那么就不會執行性下面中間件的process_request,process_view、視圖函數、process_exception方法,直接按照返回的對象執行找到對應的process_response返回;
  • 2.2如果是process_view有返回,那么就不會執行性下面中間件的process_request,、視圖函數、process_exception方法,直接按照返回的對象執行找到對應的process_response返回;
  • 2.3process_exception了解
  • 2.4process_response方法不管是否正確都要執行的,因為不管正確與否,你總要返回一個結果!

reverse函數

在寫項目的過程中,有些函數不可避免的需要傳入參數進去,所以我們在使用reverse進行反轉時也需要傳遞參數。這個時候我們就可以使用 ‘reverse()’ 中的 kwargs 參數了,它將傳入一個字典形式的變量。kwargs 也支持傳入多個參數

  • 如:
 url = reverse('url別名name',kwargs={'user_id':10})
  • 這樣就可反向解析url
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。