目录
Django中间件(MiddleWare)
中间件本身是一个很大的范围,比如:数据库中间件、服务器中间件、消息队列中间件等等…
我们这里了解到的是Django的中间件。
一、什么是中间件
Django中间件:介于request请求与response响应中间的一道处理过程,相对比较轻量级,并且在全局上改变Django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
Django官方对中间件的定义:
Middleware is a framework of hooks into Django’s request/response processing.
中间件是Django请求/响应处理的一个钩子框架。
It’s a light, low-level “plugin” system for globally altering Django’s input or output.
它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。
二、中间件的作用
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
能你还想在view执行之前做一些操作,这种情况就可以用middleware来实现。
Django默认的中间件:在django项目的settings.py文件,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下
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',
]
中间件的执行顺序:
每一个中间件在请求来的时候或者响应的时候都具有一定的作用。
三、自定义中间件
中间件里面主要有以下方法:
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
3.1 process_request与process_response方法
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求首先进过process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。
我们要自己定义中间件的话,需要写一个类,并且继承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin
第一步:需要建立一个py文件来编写我们的中间件,建议在app应用下面创建。
MyMiddleWare.py
from django.utils.deprecation import MiddlewareMixin
class Md1(MiddlewareMixin):
def process_request(self,request):
print('请求到达了Md1中间件')
def process_response(self,request,response):
print('Md1中间件响应了请求')
return response
class Md2(MiddlewareMixin):
def process_request(self,request):
print('请求到达了Md2中间件')
def process_response(self,request,response):
print('Md2中间件响应了请求')
print(response.content)
return response
第二步:在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.MyMiddleWare.Md1',
'app01.MyMiddleWare.Md2',
]
第三步:定义视图函数
def index(request):
return HttpResponse('Hello World!')
当我们浏览器朝服务端发送请求,必定会经过我们刚才定义的中间件
而process_response
方法的reuqest则是请求,response则是视图函数返回的内容到了中间件里面,然后由中间件return出去。所以我们是可以在process_response
里面不return视图函数返回的内容,自己定义内容返回。
从下图看,正常的情况下按照绿色的路线进行执行,假设中间件1有返回值,则按照红色的路线走,直接执行该类下的 process_response 方法返回,后面的其他中间件就不会执行。
也就是说中间件的process_request
方法使用了return
,那么其后面的中间件将不再执行,直接执行该中间件和其上面中间件的process_response
方法,最终将某个process_request
里面的return值返回给请求者。
由此总结:
- 中间件的process_request方法是在执行视图函数之前执行的。
- 当