一、中间件介绍

1、介绍

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

2、注意:

  对于所有请求的批量做处理的时候用中间件

  单独对某几个函数做处理的时候用装饰器

3、流程

当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

4、流程图

2323.png

Django项目请求数据:

            用户请求------>wsgiref解析数据------>中间件process_request方法  ------>urls  ------>views视图------>db和模板

Django项目响应数据:

            views渲染------>urls------> 中间件process_response 方法------>wsgiref封装数据  ------>用户

二、使用步骤

1、先建一个文件夹,里面写一个py文件

2、然后开始写类

(1)中间件就是一个类,类里面写几个方法

class M1(MiddlewareMixin):                #必须继承    def process_request(self, request):    #request: 请求里面的所有的东西        print("m1.request_request")        #这个方法里面别轻易返回值,要是有返回值就不再继续执行后面的了,执行自己的process_response和上边的response       # 一般是无返回值的:继续执行后续的中间件和视图函数    def process_response(self, request, response):        return response

(2)在settings中的MIDDLEWARE加上路径

    文件夹名称.py文件名称.类名

(3)找到继承的那个类,吧那个类拿过来

    一般不要用导入的方法,不然有时候更新了就没有这个类了,你就把它继承的那个类拿过来,

三、自定义中间件示例

settings.py文件:

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',    "app01.utils.mymiddlewares.M1",                #添加自定义的M1    "app01.utils.mymiddlewares.M2"                 #添加自定义的M2]

在app01目录下创建utils目录,utils目录下创建mymiddlewares.py文件:

mymiddlewares.py文件内容:

from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import HttpResponseclass M1(MiddlewareMixin):                  #必须继承MiddlewareMixin    def process_request(self,request):        print("M1 process_request")        # if 1:        #     return HttpResponse("IP禁止")          #自定义规则,可以实现禁掉不安全的ip地址        # 如果无返回值,就继续执行后续中间件和视图函数        # 如果有返回值,就执行自己的process_response和上面的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_response(self, request,response):        print("M2 process_response")        return response                      #页面显示index        # return HttpResponse("123")           #如果替换掉本该返回的response,那最后看到页面显示的就是123

views.py文件内容:

from django.shortcuts import render,HttpResponsedef index(request):    print("index....")    return HttpResponse("index")

执行顺序如下:

1111.png