Django中間件(Middleware)
是一個輕量級、底層的“插件”系統(tǒng)淘钟,可以介入Django的請求和響應(yīng)處理過程,修改Django的輸入或輸出.
激活中間件
需要把它添加到Django配置文件中的MIDDLEWARE_CLASSES元組中.
自定義中間件
每個中間件組件是一個獨立的Python類峻堰,可以定義下面方法中的一個或多個
- _init _:無需任何參數(shù)妨马,服務(wù)器響應(yīng)第一個請求的時候調(diào)用一次,用于確定是否啟用當(dāng)前中間件
- process_request(request):執(zhí)行視圖之前被調(diào)用弱恒,在每個請求上調(diào)用辨萍,返回None或HttpResponse對象
- process_view(request, view_func, view_args, view_kwargs):調(diào)用視圖之前被調(diào)用,在每個請求上調(diào)用斤彼,返回None或HttpResponse對象
- process_template_response(request, response):在視圖剛好執(zhí)行完畢之后被調(diào)用分瘦,在每個請求上調(diào)用蘸泻,返回實現(xiàn)了render方法的響應(yīng)對象
- process_response(request, response):所有響應(yīng)返回瀏覽器之前被調(diào)用琉苇,在每個請求上調(diào)用,返回HttpResponse對象
- process_exception(request,response,exception):當(dāng)視圖拋出異常時調(diào)用悦施,在每個請求上調(diào)用并扇,返回一個HttpResponse對象
例子:
與settings.py同級目錄下創(chuàng)建mymiddleware.py文件,定義類MyException抡诞,實現(xiàn)自定義異常process_exception方法
#---------mymiddleware.py------------
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 第一種方式
class MyException(MiddlewareMixin):
def process_exception(self,request,exception):
return HttpResponse(exception)
# 第二種方式
from ts22.models import UserModel
class UserMiddleware(MiddlewareMixin):
def __init(self,get_response):
self.get_response = get_response
def __call__(self,request):
# request到達(dá)view之前執(zhí)行的代碼
username = request.session.get('username','未登錄')
user = UserModel.objects.filter(username=username).first()
if user and not hasattr(request,'myuser'):
setattr(request,'myuser',user)
response = self.get_response(request)
# response到達(dá)用戶瀏覽器之前執(zhí)行的代碼
return response
將類MyException注冊到settings.py中間件中
#---------setting.py------------
MIDDLEWARE_CLASSES = (
...
'test11.mymiddleware.MyException',
'test11.myMiddleware.UserMiddleware',
)
# 注test11是項目名穷蛹。
模板上下文處理器(context processor)
在settings.py中,包含了當(dāng)前使用的上下文處理器昼汗。他的作用是可以給每一個response都提供自己想要添加的參數(shù)肴熏。
settings.py->TEMPLATES->OPTIONS->context_processors中使用的上下文處理器的作用:
django.template.context_processors.debug:增加一個debug變量。
django.template.context_processors.request:增加一個request的變量顷窒。
django.contrib.auth.context_processors.auth:增加了一個user的變量蛙吏。
django.contrib.messages.context_processors.messages: 增加了一個messages的變量。
自定義上下文處理器:
中間件有點類似給request添加屬性鞋吉,而上下文處理器有點類似給模板添加屬性的意思鸦做。一個是向上,一個是向下谓着。
與settings.py同級目錄下創(chuàng)建mycontextprocessor.py文件泼诱,定義一個myuser的函數(shù)
#-------------mycontextprocessor.py------------
def myuser(request):
username = request.session.get('username', '未登錄')
user = UserModel.objects.filter(username=username).first()
if user:
return {'myuser': username}
else:
return {}
# 注意:1.必須傳入request作為參數(shù) 2.必須返回一個字典
將我們定義的上下文處理器放到settings.py->TEMPLATES->OPTIONS->context_processors中。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'test11.mycontextprocessor.myuser',
],
},
},
]