Django中間件的應用
阿新 • • 發佈:2019-02-17
mps span auth 業務 cls 如果 lap bject ges
在Django中,中間件可以為我們對所有請求或一部分請求做批量處理
MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware‘, ‘django.contrib.sessions.middleware.SessionMiddleware‘, ‘django.middleware.common.CommonMiddleware‘, ‘django.middleware.csrf.CsrfViewMiddleware‘, ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, ‘django.contrib.messages.middleware.MessageMiddleware‘, ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘, ‘yangyu.middleware.auth.M1‘, # 自定義中間件,在settings.py中配置。執行的順序則跟配置列表一樣,響應則是倒著返回 ‘yangyu.middleware.auth.M2‘, ]
處理具體請求時的方法則分為5類
1.process_request(self,request) # 請求相關 2.process_view(self, request, callback, callback_args, callback_kwargs) # 視圖相關 3.process_template_response(self,request,response) # 返回值中有render()方法 4.process_exception(self, request, exception) # 異常處理 5.process_response(self, request, response) # 響應相關
執行流程的分析
""" # 在請求到來時執行,如果有response則立即返回結果,不繼續執行。沒有則先執行完所有的process_request() 1.process_request(self,request) # 進入視圖之前執行的操作,如果有response則立即返回結果,不繼續執行。沒有則先執行完所有的process_view() 2.process_view(self, request, callback, callback_args, callback_kwargs) # 返回值中有render()方法就執行,沒有則不執行 # views 業務邏輯處理(視圖函數) 3.process_template_response(self,request,response) # 執行過程中出現異常則進行異常處理,沒有則不執行 4.process_exception(self, request, exception) # 響應相關,不管上面4步從哪一步返回,都會攜帶對應的process_response()給用戶 5.process_response(self, request, response)View Code""" from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self,request): """ 根據settings列表的配置,決定執行順序 :param request: :return: """ print(‘m1.process_request‘) def process_view(self, request, callback, callback_args, callback_kwargs): """ 如果視圖出現批量需要處理的業務,則可以進行分壓、分邏輯處理 :param request: :param callback: :param callback_args: :param callback_kwargs: :return: """ print(‘m1.process_view‘) # response = callback(request,*callback_args,**callback_kwargs) # return response def process_response(self,request,response): """ 不管是何執行結果,都會返回相應的HttpResonse對象 :param request: :param response: :return: """ print(‘m1.process_response‘) return response def process_exception(self, request, exception): """ 出現異常才會被調用進行異常處理 :param request: :param exception: :return: """ print(‘m1.process_exception‘) def process_template_response(self,request,response): """ 視圖函數的返回值中,如果有render方法,才被調用 :param request: :param response: :return: """ print(‘m1.process_template_response‘) return response class M2(MiddlewareMixin): """ 在此處可以包含多個中間件的處理方法 """ def process_request(self,request): print(‘m2.process_request‘) def process_view(self, request, callback, callback_args, callback_kwargs): print(‘m2.process_view‘) def process_response(self,request,response): print(‘m2.process_response‘) return response def process_exception(self, request, exception): print(‘m2.process_exception‘) return HttpResponse(‘錯誤了...‘)
process_template_response()則還可以再次封裝
from django.shortcuts import render class JSONResponse: """ process_template_response()方法,需要返回時執行render()方法, 這個特別之處可以讓我們進行封裝。 """ def __init__(self, req, status, msg): self.req = req self.status = status self.msg = msg def render(self): # 重寫render()方法,返回json數據 import json ret = { ‘status‘: self.status, ‘msg‘:self.msg } return HttpResponse(json.dumps(ret)) def test(request): ret = {} # 調用封裝的方法,傳入數據 return JSONResponse(request, True, "錯誤信息")
Django中settings.py中字符串導入類的方法
在終端CMD中 mkdir auth cd auth 新建csrf.py文件 class CORS(object):pass # 根據字符串的形式,自動導入模塊並使用反射找到模塊中的類 path = r"C:\Users\yangy\auth.crsf.CORS" # importlib 模塊支持傳遞字符串來導入模塊 import importlib # 從右往左以.切割,分別獲取路徑和類名 module_path, class_name = path.rsplit(‘.‘,maxsplit=1) # 根據字符串的形式導入模塊返回調用結果 m = importlib.import_module(module_path) # 反射獲取調用的對象 cls = getattr(m,class_name) # 實例化對象 obj = cls() # 引用 obj.process_request()
Django中間件的應用