1、介绍
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。
2、注意:
对于所有请求的批量做处理的时候用中间件
单独对某几个函数做处理的时候用装饰器
3、流程
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。
4、流程图
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")
执行顺序如下:
原文地址:http://blog.51cto.com/qidian510/2113330