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'): # 如果请求`self`中有这个属性,则response为请求,中间件函数返回的值)
response = self.process_request(request)
if not response:
response = self.get_response(request) # 如果没有response,就为self.get_response(request)中的参数(None)
if hasattr(self, 'process_response'): # 如果都没有则response 为None
response = self.process_response(request, response)
return response
可以知道MiddlewareMixin是调用了其内部的__call__方法,
__call__方法以反射的方式执行process_request和process_response方法.
中间件的应用
新建一个middleware
项目,在项目的根目录中新建一个名为middleware
的包,在这个package
中,新建一个middleware.py
文件.
导入django.utils.depercation 的
MiddlewareMixin
,编写一个类,继承MiddlewareMixin
,重写process_request
,process_response
process_request
方法不能有return
,一定要使用return的时候,要配合条件判断语句执行
process_response
方法一定要有return
,否则程序会运行错误
process_view
方法不能有return,否则视图函数不会执行
process_exception
方法只有在程序出现运行错误的时候才会执行
process_exception
方法设定return时,程序不会再执行后续中间件中的process_exception
process_template_response
方法只有在视图函数中使用render方法返回信息的时候才会执行
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',
]
先执行
process_request
方法,因为process_request
方法有返回值
,程序不会再执行后面的中间件
,而是直接执行process_response
方法,然后返回信息给用户
.
现在如果有http
请求到达服务端,先执行中间件middle_ware1
的process_request
方法,再执行后面的中间件
,然后到达视图函数
.
中间件的依次执行为:
先执行middle_ware1的process_request方法,
再执行middle_ware2的类的process_request方法,
最后才执行Django的视图函数.
返回时,先执行middle_ware2的类中的process_response函数,
然后再执行middle_ware1的类中的process_response函数.
程序执行流程:
先执行所有中间件中的process_request方法-->进行路由匹配-->执行中间件中的的process_view方法
-->执行对应的视图函数-->执行中间件中的process_response方法
总结
中间件里本质上就是一个类,
对全局的http请求做处理的时候可以使用中间件
中间件中的方法不一定要全部使用,需要哪个用哪个
网友评论