在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