Django 中間件簡介

Django 中間件簡介

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

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

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

process_request(self,request) 發送請求函數

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

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

process_response(self, request, response) 必須返回 HttpResponse 對象. 這個 response 對象能夠是傳入函數的那一個原始對象(一般已被修改),也能夠是全新生成的。中間件

中間件之  process_request,process_response對象

process_request(self,request)blog

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")

運行以後效果

 

相關文章
相關標籤/搜索