Django 中介軟體 在其他語言中,有人叫這個管道
https://code.ziqiangxuetang.com/django/django-middleware.html
我們從瀏覽器發出一個請求 Request,得到一個響應後的內容 HttpResponse ,這個請求傳遞到 Django的過程如下:
也就是說,每一個請求都是先通過中介軟體中的 process_request 函式,這個函式返回 None 或者 HttpResponse 物件,如果返回前者,繼續處理其它中介軟體,如果返回一個 HttpResponse,就處理中止,返回到網頁上。
中介軟體不用繼承自任何類(可以繼承 object ),下面一箇中間件大概的樣子:
classCommonMiddleware(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(這部分沒有提供程式碼,主要講中介軟體部分)
#專案 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.1 Django 1.9 和以前的版本:
MIDDLEWARE_CLASSES = ( 'zqxt.middleware.BlockedIpMiddleware', ...其它的中介軟體 )
1.2 Django 1.10 版本 更名為 MIDDLEWARE(單復同形),寫法也有變化,詳見 第四部分。
如果用 Django 1.10版本開發,部署時用 Django 1.9版本或更低版本,要特別小心此處。
MIDDLEWARE = ( 'zqxt.middleware.BlockedIpMiddleware', ...其它的中介軟體 )
Django 會從 MIDDLEWARE_CLASSES 或 MIDDLEWARE 中按照從上到下的順序一個個執行中介軟體中的 process_request 函式,而其中 process_response 函式則是最前面的最後執行。