中间件
1. 什么是中间件
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
Django默认的中间件:(在django项目的settings模块中,有一个 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', ] # django默认有七个中间件, # 最好了解记住几个 'django.middleware.security.SecurityMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
2. 自定义中间件
2.1 中间件可以自定义的五个方法
# 中间件可以定义五个方法,分别是:(主要的是process_request和process_response) 1.process_request 请求来的时候 2.process_response 响应走的时候 3.process_view 路由匹配成功即将执行视图函数之前 4.process_template_response 视图函数中返回了render对象 5.process_exception 视图函数报错之后 报错信息会交给当前方法
2.2 如何自定义一个中间件
# 如何自定义中间件 # 1.在某个应用下创建一个任意名称的py文件 # 2.写一个类继承MiddlewareMixin # 3.在该类中书写上述五个可以自定义的方法 # 4.在settings配置文件将你写的中间件添加到Middleware配置项中 # ps:格式应用名.py文件名.类名 (不会自动提示 书写的时候要格外注意)
中间件代码:
from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1里面的 process_request") def process_response(self, request, response): print("MD1里面的 process_response") class MD2(MiddlewareMixin): def process_request(self, request): print("MD2里面的 process_request") pass def process_response(self, request, response): print("MD2里面的 process_response") return response
views中的代码:
def index(request): print("view函数...") return HttpResponse("OK")
执行结果为:
MD1里面的 process_request
MD2里面的 process_request
view函数...
MD2里面的 process_response
MD1里面的 process_response
3. 中间件的执行流程
1. 在只有 process_request和process_response中,如果process_request中的返回值为None的话,那么执行的顺序为:
先执行所有的process_request,然后执行view中的函数, 再反过来执行process_response中的内容,
process_response的执行顺序为从下往上,正好和process_request的顺序相反。
2. 当process_request中的返回值不再是None的时候,先依次执行的顺序为:先执行process_request中的内容,
当遇到返回值不在我None的时候,跳过view中的函数,直接执行process_response中的内容,process_response的执行顺序为倒序,
从当前返回值不为None的地方开始执行process_response
3. 当存在process_view时,且process_request与process_view的返回值都为None的时候,执行顺序为先依次执行process_request,
然后再从头依次执行peocess_view,然后执行view中的代码,最后再倒过来从后往前执行process_response的内容
4. 当process_view中存在返回值不是None的情况下,执行的顺序为:先正常执行process_request,在依次执行process_view,
当执行完返回值不为None的情形下,直接跳过后续的执行process_view逻辑和view中的函数,从后往前执行process_response的顺序