1. 程式人生 > >Django學習筆記之中介軟體和上下文處理器

Django學習筆記之中介軟體和上下文處理器

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',
            ],
        },
    },
]