1. 程式人生 > >Django 中間件簡介

Django 中間件簡介

請求 soft 規則 ngs cep 執行 有一個 exception def

Django 中間件簡介

django 中的中間件(middleware),在django中,中間件其實就是一個類,在請求到來和結束後,django會根據自己的規則在合適的時機執行中間件中相應的方法。

在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每一個元素就是一個中間件

技術分享圖片

中間件中一共有四個方法:

process_request(self,request) 發送請求

process_view(self, request, callback, callback_args, callback_kwargs) 執行完 request 預處理函數並確定待執行的 view 之後,但在 view 函數實際執行之前。

process_exception(self, request, exception) 收集錯誤信息

process_response(self, request, response) 必須返回 HttpResponse 對象. 這個 response 對象可以是傳入函數的那一個原始對象(通常已被修改),也可以是全新生成的。

中間件之 process_request,process_response

process_request(self,request)

process_response(self, request, response)

當用戶發起請求的時候會依次經過所有的的中間件,這個時候的請求時process_request,最後到達views的函數中,views函數處理後,在依次穿過中間件,這個時候是process_response,最後返回給請求者

在django中叫中間件,在其他web框架中,有的叫管道,httphandle

技術分享圖片

中間件都是django中的,我們也可以自己定義一個中間件,我們可以自己寫一個類,但是必須繼承MiddlewareMixin

技術分享圖片

需要註意的是順序,因為是列表或者元組的順序,註冊時按照你既定順序來配置

所以需要導入:from django.utils.deprecation import MiddlewareMixin

項目文件下創建一個Middle目錄,並在下面創建md.py代碼例子如下:

#from django.utils.deprecation import MiddlewareMixin
#建議定義類使用MiddlewareMixin
class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, process_request): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, process_response): response = self.process_response(request, response) return response class M1(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print(m1.process_request) print("中間件1請求") def process_response(self, request, response): print(m1.process_response) print("中間件1返回") return response class M2(MiddlewareMixin): def process_request(self,request,*args,**kwargs): print(m2.process_request) print("中間件2請求") def process_response(self, request, response): print(m2.process_response) print("中間件2返回") return response

這樣當頁面發起請求的時候:後臺效果如下

技術分享圖片

中間件之process_view

process_view(self, request, callback, callback_args, callback_kwargs)

我們在md.py文件中的的代碼進行更改:

from django.conf import settings
from django.shortcuts import redirect,HttpResponse

class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, process_request):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, process_response):
            response = self.process_response(request, response)
        return response


class M1(MiddlewareMixin):

    def process_request(self,request,*args,**kwargs):

        print(m1.process_request)
        print("中間件1請求")

    def process_response(self, request, response):
        print(m1.process_response)
        print("中間件1返回")
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中間件1view")


class M2(MiddlewareMixin):
    def process_request(self,request,*args,**kwargs):
        print(m2.process_request)
        print("中間件2請求")

    def process_response(self, request, response):
        print(m2.process_response)
        print("中間件2返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中間件2view")

運行之後效果

技術分享圖片

Django 中間件簡介