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请求做处理的时候可以使用中间件
中间件中的方法不一定要全部使用,需要哪个用哪个










网友评论