1,定義
Django中的中間件是一個輕量級、底層的插件系統,可以介入Django的請求和響應處理過程,修改Django的輸入或輸出。中間件的設計爲開發者提供了一種無侵入式的開發方式,增強了Django框架的健壯性,其它的MVC框架也有這個功能,名稱爲IoC。
2,各個方法
Django在中間件中預置了五個方法,這五個方法的區別在於不同的階段執行,對輸入或輸出進行干預,方法如下:
- 1)初始化:無需任何參數, 服務器接收第一個請求時會被調用一次,而且只調用一次,用於確定是否啓用當前中間件。
def init():
pass
- 2)在進行url匹配之前被調用,在每個請求上調用,返回None或HttpResponse對象。
def process_request(request):
pass
- 3)在url匹配之後,視圖函數調用之前被調用,在每個請求上調用,返回None或HttpResponse對象。
def process_view(request, view_func, view_args, view_kwargs):
pass
- 4) 視圖函數之後會被調用:所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。
def process_response(request, response):
pass
- 5)異常處理:當視圖函數拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
def process_exception(request,exception):
pass
3,案例加以說明
- 1)在booktest/目錄下創建middleware.py文件,代碼如下:
from django.http import HttpResponse
from django.conf import settings
class MyMiddleWare(object):
def __init__(self):
print("init")
def process_request(self,request):
print("prcess_request")
def process_view(self,request,view_func,*view_args,**view_kwargs):
print("process_view")
def process_response(self,request,response):
print("process_response")
return response
def process_exception(self,request,exception):
print("exception")
- 2)在test05/settings.py文件中,向MIDDLEWARE_CLASSES項中註冊。
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'booktest.middleware.MyMiddleWare',
)
- 3)修改booktest/views.py中視圖index。
# 首頁的視圖函數
def index(request):
print("index")
return render(request,'booktest/index.html')
- 4)運行服務器,命令行中效果如下圖:
- 5)刷新頁面,命令行中效果如下圖:
- 6)異常中間件效果:
+如果多箇中間件中註冊了相同的方法,則先註冊的後執行。
修改視圖函數如下:
# 首頁的視圖函數
def index(request):
print("index")
raise Exception("value error")
return render(request,'booktest/index.html')
效果圖如下: