1、中间件的定义
- 中间件是Django 请求/响应 处理的钩子框架。(类似于vue中的生命周期钩子)
- 它是一个轻量级的“插件”系统,用于全局改变Django的输入和输出(请求和响应)
- 中间件以类的形式体现
- 每个中间件组件负责做一些特定的功能。
2、编写中间件
2.1、编写中间件类
中间件类必须继承自 django.utils.deprecation.MiddlewareMixin类
或者 django.middleware.common.MiddlewareMixin (都可以都是一个)
process_request( self , request )
执行路由之前被调用,在每个请求上调用,返回 None 或者 HttpResponse对象
process_view( self , request , callback , callback_args , callback_kwargs )
调用视图之前被调用,在每个请求上调用,返回 None 或者 HttpResponse对象
process_response( self , request , response )
所有响应返回浏览器之前被调用,在每个请求上调用,必须返回 HttpResponse对象
process_exception( self , request , exception )
当处理过程中抛出异常时调用,返回一个 HttpResponse对象
process_template_response( self , request , response ) 不常用了解即可
在视图函数执行完,并且视图返回的对象中包含 render 方法时被调用;
该方法需要返回实现了 render 方法的响应对象
注意:
中间件的大多数方法在返回 None 时,表示忽略当前操作进入下一项事件;
当返回HttpResponse对象时,表示此请求结束,直接返回给客户端。
编写中间件示例:
一般在项目同级目录创建一个 Python Package 文件夹,文件夹名称自定义,一般命名为 middleware;
在middleware文件夹中,创建 一个python文件,文件名称自定义(本示例,命名为mymiddleware);
在mymiddleware.py文件中编写中间件类
from django.utils.deprecation import MiddlewareMixin
class MyMiddleWare1(MiddlewareMixin):
def process_request(self, request):
# 执行路由之前被调用,在每个请求上调用,返回 None 或者 HttpResponse对象
print("MyMiddleWare1 process_request 被调用了~")
def process_view(self, request, callback, callback_args, callback_kwargs):
# 调用视图之前被调用,在每个请求上调用,返回 None 或者 HttpResponse对象
print("MyMiddleWare1 process_view 被调用了~~")
def process_response(self, request, response):
# 所有响应返回浏览器之前被调用,在每个请求上调用,必须返回 HttpResponse对象
print("MyMiddleWare1 process_response 被调用了~~~~")
return response
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',
'middleware.mymiddleware.MyMiddleWare1' #格式:(根目录的文件夹.文件名.类名)
# 注册我们自定义的中间件
# 中间件类的项目路径加入这个数据即可
]
多个中间件的执行顺序
让我们通过一次Django的一次请求和响应来试一下多个中间件的执行顺序
编写中间件类
from django.utils.deprecation import MiddlewareMixin
class MyMiddleWare1(MiddlewareMixin):
# 测试多个中间件执行顺序的第1个中间件
def process_request(self, request):
print("MyMiddleWare1 process_request 被调用了~~~~~~")
def process_view(self, request, callback, callback_args, callback_kwargs):
print("MyMiddleWare1 process_view 被调用了~~~~~~")
def process_response(self, request, response):
print("MyMiddleWare1 process_response 被调用了~~~~~~")
return response
class MyMiddleWare2(MiddlewareMixin):
# 测试多个中间件执行顺序的第2个中间件
def process_request(self, request):
print("MyMiddleWare2 process_request 被调用了>>>>>>>>>>")
def process_view(self, request, callback, callback_args, callback_kwargs):
print("MyMiddleWare2 process_view 被调用了>>>>>>>>>>")
def process_response(self, request, response):
print("MyMiddleWare2 process_response 被调用了>>>>>>>>>>")
return response
注册这两个中间件类
# 用于注册中间件
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',
'middleware.mymiddleware.MyMiddleWare1', # 注册我们自定义的中间件
'middleware.mymiddleware.MyMiddleWare2' # 注册我们自定义的中间件
]
应用中的视图
from django.shortcuts import render, HttpResponse,HttpResponseRedirect
import json
def test(request):
# 测试中间件执行顺序的视图函数
print("test视图函数,被调用了!!!!!!!!!!")
data={"msg":"success!"}
return HttpResponse(json.dumps(data))
绑定路由和视图
from django.contrib import admin
from django.urls import path
from user import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test', views.test),
]
浏览器发起请求、获取响应
查看控制台输出,
多个中间件的执行顺序
- 先按照注册顺序“自上而下”,(进入视图函数之前,按照注册顺序执行)
- 执行完视图后
- 再按照注册顺序“自下而上”(在视图函数之后,按照注册顺序 由下而上 执行)
4、Django请求流程图
5、参考博客:
码迷:Django的中间件
http://www.mamicode.com/info-detail-2504161.html