中间件就是一个类,使用需要注册这个类。在这个类中有process_requestprocess_response,返回值只有reponse有,如果第一个有的话,就不会走view函数了。
django中间件_第1张图片
djanjo 中间件版本差异报错处理:

1.9.x版本以下djanjo中间件定义规则

class CommonMiddleware(object):
def process_request(self, request):
return None

def process_response(self, request, response):
    return response

最新的1.10.x版本djanjo中间件定义规则----------不是执行的类下的方法,而是执行MiddlewareMixin对象的call方法(方法中调用,process_request等方法)

from djanjo.utils.deprecation import MiddlewareMixin
class CommonMiddleware(MiddlewareMixin):
def process_request(self, request):
return None

def process_response(self, request, response):
    return response

下面的方法就可以让 中间件 兼容 Django新版本和旧版本------------上面俩种的合并

call 方法会先调用 self.process_request(request),接着执行 self.get_response(request) 然后调用 self.process_response(request, response)

django中间件_第2张图片

process_view 中的view会把所有的response都会返回,而process_request是只会从第一个上面返回。

下面的代码

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class M1(MiddlewareMixin):
    def process_request(self,request):
        print('m1.process_request')

    def process_view(self, request, callback, callback_args, callback_kwargs):
        print('m1.process_view')
        # response = callback(request,*callback_args,**callback_kwargs)
        # return response

    def process_response(self,request,response):
        print('m1.process_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

request_exception执行流程
django中间件_第3张图片
应用:
1、对一部分数据或者 全部数据进行批量处理的
2、缓存的使用,如果缓存用,就使用没有就执行后面的查找