中間件: 正常調用順序是從上往下,但如註冊了多個中間件類中包含 process_exception函數的時候,process_exception函數調用的順序跟註冊的順序是相反的,下麵兩張圖說明: 流程圖: 註意:process_response之前的中間件如無返回,則預設返回 None,會繼續執行 ...
中間件:
class TestMiddleware(object): """中間件類""" def __init__(self): """伺服器重啟之後,接收第一個請求時調用""" pass def process_request(self, request): """產生request對象之後,url匹配之前調用""" pass def process_view(self, request, view_func, *view_args, **view_kwargs): """url匹配之後,視圖函數調用之前調用""" pass def process_exception(self, request, exception): """視圖函數發生異常時調用""" pass def process_response(self, request, response): """視圖函數調用之後,內容返回瀏覽器之前調用""" return response
正常調用順序是從上往下,但如註冊了多個中間件類中包含 process_exception函數的時候,process_exception函數調用的順序跟註冊的順序是相反的,下麵兩張圖說明:
流程圖:
註意:process_response之前的中間件如無返回,則預設返回 None,會繼續執行下一個中間件,但如有返回,則直接跳到 process_response中間件
例子:
1.
在app內新建一個 middleware.py 文件
2.
from django.http import HttpResponse class BlacklistIPSMiddleware(object): """中間件類""" EXCLUDE_IPS = ['192.168.1.1'] def process_view(self, request, view_func, *view_args, **view_kwargs): """視圖函數調用之前會調用""" user_ip = request.META['REMOTE_ADDR'] # 獲取訪問用戶的IP if user_ip in BlacklistIPSMiddleware.EXCLUDE_IPS: return HttpResponse('您在黑名單中')
3.
在settings配置文件中註冊中間件類
# 'app名.中間件文件名.中間件類名'
MIDDLEWARE_CLASSES = (...,
...,
‘book.middleware.BlacklistIPSMiddleware’)