中間件介紹
中間件顧名思義,是介于request與response處理之間的一道處理過程,相對比較輕量級,并且在全局上改變django的輸入與輸出。因為改變的是全局,所以需要謹慎實用,用不好會影響到性能。
每個中間件都會負責一個功能,例如,AuthenticationMiddleware,與sessions處理相關。
激活中間件
需要在settings.py配置文件中,配置MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',]
當然你也可以不試用任何的中間件,這個可以設置為空。
中間件順序
一般我們我們從瀏覽器發出一個請求 Request,得到一個響應后的內容 HttpResponse ,這個請求傳遞到 Django的過程如下,process request 和 process response的執行順序正好相反,如下圖所示:
也就是說,每一個請求都是先通過中間件中的 process_request 函數,這個函數返回 None 或者 HttpResponse 對象,如果返回前者,繼續處理其它中間件,如果返回一個 HttpResponse,就處理中止,返回到網頁上。
中間件不用繼承自任何類(可以繼承 object ),下面一個中間件大概的樣子:
class CommonMiddleware(object): def process_request(self, request): return None def process_response(self, request, response): return response
需要用到的幾個hook:
process_request() process_exception() (only if the view raised an exception) process_template_response() process_response()常用的中間件組件:
1. Sessions
2. Authentication
3. CSRF Protection
4. GZipping Content
例如,比如我們要做一個 流量統計
class BlockedIpMiddleware(object): def process_request(self, request): ...數據庫拿access值 access = access+1 ...存起來,類似這個原理
這里的代碼的功能就是 簡單的訪問一次加一次,把這個中間件的 Python 路徑寫到settings.py中
MIDDLEWARE_CLASSES = ( 'zjj.middleware.BlockedIpMiddleware', ...其它的中間件)
Django 會從 MIDDLEWARE_CLASSES 中按照從上到下的順序一個個執行中間件中的 process_request 函數,而其中 process_response 函數則是最前面的最后執行。
二,再比如,我們在網站放到服務器上正式運行后,DEBUG改為了 False,這樣更安全,但是有時候發生錯誤不能顯示錯誤詳情頁面,有沒有辦法處理好這兩個事情呢?
新聞熱點
疑難解答