1. 程式人生 > >Django 中介軟體 在其他語言中,有人叫這個管道

Django 中介軟體 在其他語言中,有人叫這個管道

https://code.ziqiangxuetang.com/django/django-middleware.html

我們從瀏覽器發出一個請求 Request,得到一個響應後的內容 HttpResponse ,這個請求傳遞到 Django的過程如下:

也就是說,每一個請求都是先通過中介軟體中的 process_request 函式,這個函式返回 None 或者 HttpResponse 物件,如果返回前者,繼續處理其它中介軟體,如果返回一個 HttpResponse,就處理中止,返回到網頁上。

中介軟體不用繼承自任何類(可以繼承 object ),下面一箇中間件大概的樣子:

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(這部分沒有提供程式碼,主要講中介軟體部分)

#專案 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 函式則是最前面的最後執行。