Django學習筆記之中介軟體和上下文處理器
阿新 • • 發佈:2019-01-27
Django
中介軟體(Middleware
)
是一個輕量級、底層的“外掛”系統,可以介入Django
的請求和響應處理過程,修改Django
的輸入或輸出.
啟用中介軟體
需要把它新增到Django
配置檔案中的MIDDLEWARE_CLASSES
元組中.
自定義中介軟體
每個中介軟體元件是一個獨立的Python類,可以定義下面方法中的一個或多個
- _init _:無需任何引數,伺服器響應第一個請求的時候呼叫一次,用於確定是否啟用當前中介軟體
- process_request(request):執行檢視之前被呼叫,在每個請求上呼叫,返回None或HttpResponse物件
- process_view(request, view_func, view_args, view_kwargs):呼叫檢視之前被呼叫,在每個請求上呼叫,返回None或HttpResponse物件
- process_template_response(request, response):在檢視剛好執行完畢之後被呼叫,在每個請求上呼叫,返回實現了render方法的響應物件
- process_response(request, response):所有響應返回瀏覽器之前被呼叫,在每個請求上呼叫,返回HttpResponse物件
- process_exception(request,response,exception):當檢視丟擲異常時呼叫,在每個請求上呼叫,返回一個HttpResponse物件
例子:
與settings.py
同級目錄下建立mymiddleware.py
檔案,定義類MyException
process_exception
方法
#---------mymiddleware.py------------
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
# F1
class MyException(MiddlewareMixin):
def process_exception(self,request,exception):
return HttpResponse(exception)
# F2
from ts22.models import UserModel
class UserMiddleware(MiddlewareMixin):
def __init(self,get_response):
self.get_response = get_response
def __call__(self,request):
# request到達view之前執行的程式碼
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到達使用者瀏覽器之前執行的程式碼
return response
# 這樣寫之後,view函式裡面就可以跟之前省去一部分內容了
將類MyException
註冊到settings.py
中介軟體中
#---------setting.py------------
MIDDLEWARE_CLASSES = (
...
'test.mymiddleware.MyException',
'test.myMiddleware.UserMiddleware',
)
# 注test11是專案名。
模板上下文處理器(context processor)
在settings.py
中,包含了當前使用的上下文處理器。他的作用是可以給每一個response
都提供自己想要新增的引數。
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
同級目錄下建立mycontextprocessor.py
檔案,定義一個myuser
的函式
#-------------mycontextprocessor.py------------
from music.models import UserModel
def myuser(request):
username = request.session.get('username', '未登入')
user = UserModel.objects.filter(username=username).first()
if user:
return {'myuser': user.username}
else:
return {}
# 注意:1.必須傳入request作為引數 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',
],
},
},
]