![f363dab02b459ace0c53e9a6caf43ce8.png](https://i-blog.csdnimg.cn/blog_migrate/9881077890a3a02fd8422f78f647d2aa.jpeg)
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件.
假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢?
Django的中间件的简介
Django的中间件类似于linux中的管道符
Django的中间件实质就是一个类,类之中有Django已经定义好了一些方法.
每个http请求都会执行中间件中的一个或多个方法
进入Django中的请求都会执行process_request方法;
Django返回的信息都会执行process_response方法.;
Django内部的中间件注册在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',
]
导入from django.middleware.csrf import CsrfViewMiddleware模块,查看其源码
class CsrfViewMiddleware(MiddlewareMixin)
可以看到CsrfViewMiddleware是继承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
可以知道MiddlewareMixin是调用了其内部的__call__方法,__call__方法以反射的方式执行process_request和process_response方法.
中间件的应用
新建一个middleware项目,在项目的根目录中新建一个名为middleware的包,在这个package中,新建一个middleware.py文件.
from django.utils.deprecation import MiddlewareMixin
class middle_ware1(MiddlewareMixin):
def process_request(self,request):
print("middle_ware1.process_request")
def process_response(self,request,response):
print("middle_ware1.process_response")
return response
在settings.py配置文件的第一行注册这个中间件
MIDDLEWARE = [
'middleware.middleware.middle_ware1'
'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',
]
现在如果有http请求到达服务端,先执行中间件middle_ware1的process_request方法,再执行后面的中间件,然后到达视图函数.
定义一个视图函数index,配置好路由映射表
def index(request):
print("index page")
return HttpResponse("index")
启动程序,在浏览器中输入http://127.0.0.1:8000/index,会在服务端的后台打印:
middle_ware1.process_request
index page
middle_ware1.process_response
前端的页面为显示为:
index
通过这个我们知道,所有的请求都会经过middle_ware1这个中间件,先执行process_request方法,再执行视图函数本身
最后执行process_response方法,Django会把process_response方法的返回值返回给客户端.
现在再加一个定义一个middle_ware2的中间件
from django.utils.deprecation import MiddlewareMixin
class middle_ware2(MiddlewareMixin):
def process_request(self,request):
print("middle_ware2.process_request")
def process_response(self,request,response):
print("middle_ware2.process_response")
return res