中間件顧名思義,是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。由於改變的是全局,因此須要謹慎實用,用很差會影響到性能。django
1 MIDDLEWARE = [ 2 'django.middleware.security.SecurityMiddleware', 3 'django.contrib.sessions.middleware.SessionMiddleware', 4 'django.middleware.common.CommonMiddleware', 5 'django.middleware.csrf.CsrfViewMiddleware', 6 'django.contrib.auth.middleware.AuthenticationMiddleware', 7 'django.contrib.messages.middleware.MessageMiddleware', 8 'django.middleware.clickjacking.XFrameOptionsMiddleware', 9 ]
中間件的四個方法 process_request(self,request) 當用戶發起請求的時候會依次通過全部的的中間件,這個時候的請求時process_request,最後到達views的函數中 process_response(self,request,reponse) views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者。 process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self) # 默認不執行
process_template_response()只有在視圖函數的返回對象中有render方法纔會執行!session
自定義中間件ide
本身寫一個類,可是必須繼承MiddlewareMixin from django.utils.deprecation import MiddlewareMixin
1 def index(request): 2 3 print("view函數...") 4 return HttpResponse("OK")
1 from django.utils.deprecation import MiddlewareMixin 2 from django.shortcuts import HttpResponse 3 4 class Md1(MiddlewareMixin): 5 6 def process_request(self,request): 7 print("Md1請求") 8 9 def process_response(self,request,response): 10 print("Md1返回") 11 return response 12 13 class Md2(MiddlewareMixin): 14 15 def process_request(self,request): 16 print("Md2請求") 17 #return HttpResponse("Md2中斷") 18 def process_response(self,request,response): 19 print("Md2返回") 20 return response
from django.shortcuts import redirect, HttpResponse from django.utils.deprecation import MiddlewareMixin class AuthMD(MiddlewareMixin): white_list = ['/login/', ] # 白名單 black_list = ['/black/', ] # 黑名單 def process_request(self, request): next_url = request.path_info print(request.path_info, request.get_full_path()) if next_url in self.white_list or request.session.get("user"): return elif next_url in self.black_list: return HttpResponse('This is an illegal URL') else: return redirect("/login/?next={}".format(next_url))# 正常狀況下返回None