1. 程式人生 > >Django中間件的應用

Django中間件的應用

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)
""" 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(錯誤了...)
View Code

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中間件的應用