Django之中间件

一、中间件介绍

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 MiddlewareMixin
from django.shortcuts import HttpResponse

class 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,HttpResponse
def index(request):
    print("index....")
    return HttpResponse("index")

执行顺序如下:

1111.png




猜你喜欢

转载自blog.51cto.com/qidian510/2113330