Django 中介軟體
Middleware也就是所謂的中介軟體 Django的中介軟體的這個中間指的是 伺服器接受到Request ---- View處理,以及View處理完 ---- 傳送Response到客戶端 這兩個中間。
1.中介軟體只是實現了某些特定方法的普通物件
所以定義一箇中間件很容易,你只需要定義一個普通的python類,然後實現如下四個方法中的某一個或者某幾個各個函式執行的時機
process_request #
process_view #
process_response
process_exception(self, request, exception) #
2.安裝中介軟體
-
MIDDLEWARE_CLASSES
= ( - 'django.middleware.common.CommonMiddleware',
-
'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
-
'django.contrib.auth.middleware.AuthenticationMiddleware
' , - )
這裡指定的順序和實際執行時執行的順序相關,
在request階段:process_request,process_view 按照其所在類在配置中的先後順序進行,
在response階段:process_response,process_exception
還有一點就是在整個流程中,每一個process_response都會執行到,
而其餘三種,都可能會因為其他的直接retuen response或者不發生異常而不被執行到。
---------------------------------------------------------------------------------------------------------------------------------我們從瀏覽器發出一個請求 Request,得到一個響應後的內容 HttpResponse ,這個請求傳遞到 Django的過程如下:
也就是說,每一個請求都是先通過中介軟體中的 process_request 函式,這個函式返回 None 或者 HttpResponse 物件,如果返回前者,繼續處理其它中介軟體,如果返回一個 HttpResponse,就處理中止,返回到網頁上。
中介軟體不用繼承自任何類(可以繼承 object ),下面一箇中間件大概的樣子:
1 2 3 4 5 6 |
class CommonMiddleware( object ):
def process_request( self , request):
return None
def process_response( self , request, response):
return response
|
還有 process_view, process_exception 和 process_template_response 函式。
一,比如我們要做一個 攔截器,發生有惡意訪問網站的人,就攔截他!
假如我們通過一種技術,比如統計一分鐘訪問頁面數,太多就把他的 IP 加入到黑名單 BLOCKED_IPS(這部分沒有提供程式碼,主要講中介軟體部分)
1 2 3 4 5 6 |
#專案 zqxt 檔名 zqxt/middleware.py
class BlockedIpMiddleware( object ):
def process_request( self , request):
if request.META[ 'REMOTE_ADDR' ] in getattr (settings, "BLOCKED_IPS" , []):
return http.HttpResponseForbidden( '<h1>Forbidden</h1>' )
|
這裡的程式碼的功能就是 獲取當前訪問者的 IP (request.META['REMOTE_ADDR']),如果這個 IP 在黑名單中就攔截,如果不在就返回 None (函式中沒有返回值其實就是預設為 None),把這個中介軟體的 Python 路徑寫到settings.py中
1 2 3 4 |
MIDDLEWARE_CLASSES = (
'zqxt.middleware.BlockedIpMiddleware' ,
...其它的中介軟體
)
|
Django 會從 MIDDLEWARE_CLASSES 中按照從上到下的順序一個個執行中介軟體中的 process_request 函式,而其中 process_response 函式則是最前面的最後執行。
二,再比如,我們在網站放到伺服器上正式執行後,DEBUG改為了 False,這樣更安全,但是有時候發生錯誤不能顯示錯誤詳情頁面,有沒有辦法處理好這兩個事情呢?
-
普通訪問者看到的是友好的報錯資訊
-
管理員看到的是錯誤詳情,以便於修復 BUG
當然可以有,利用中介軟體就可以做到!程式碼如下:
1 2 3 4 5 6 7 8 |
|