什么是中间件
官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在处理请求的特定的时间去执行这些方法。
自定义中间件
中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
- process_request(self,request)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
process_request(self,request)
首先在项目的APP中创建中间件目录,在目录先创建中间件文件夹
mymiddleware.py文件
# 导入MiddlewareMixin from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print('MD1 process_request')
在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.middleware.mymiddleware.MD1', ]
urls 地址
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), ]
views文件
from django.shortcuts import render ,HttpResponse def index(request): print('index') return HttpResponse('98K')
访问indenx
打印顺序
[10/Feb/2019 17:12:02] "GET / HTTP/1.1" 404 2022 MD1 process_request index
- 说明process_request在视图函数之前执行
- 参数 request :request对象跟视图函数中的是同一个
- 执行顺序:如果有多个process_request,按照注册顺序执行
- 返回值 :
- None 正常流程
- HttpResponse对象:不执行下一个中间件中的process_request方法,也不执行视图函数,直接执行当前中间件中的process_response的方法
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class MD1(MiddlewareMixin): def process_request(self, request): print('MD1 process_request') return HttpResponse('MD1') #返回HttpResponse对象
process_response(self,request,response)
# 导入MiddlewareMixin from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class MD1(MiddlewareMixin): def process_request(self, request): print('MD1 process_request') #return HttpResponse('MD1') def process_response(self,request,response): print('process_response') return response #必须返回response,否则报错
执行顺序
MD1 process_request
index
process_response
- 执行时间: 在视图函数之后
- 返回值 : 必须有返回值
- 参数:
- request : request对象,跟视图函数中是同一个
- response : 视图函数返回的HttpResponse对象
- 执行顺序: 先注册的后执行,倒序执行
process_view(self, request, view_func, view_args, view_kwargs)
- 执行时间: 在process_request之后,在视图函数之前
- 参数 : view_func 要执行的视图函数
- view_args 视图函数的位置参数
- view_kwargs 视图函数的关键字参数
- 执行顺序 :顺序执行
- 返回值 :
- None 正常流程
- HttpResponse对象 :下一个中间件中的process_view方法不执行,视图函数不执行,执行最后一个中间件的process_response方法
process_exception(self, request, exception)
def process_exception(self,request,exception): print('MD1 process_exception') return HttpResponse('已经处理完了')
- 执行时间 :有异常才触发执行,在视图函数之后
- 参数:
- request :request对象,跟视图函数函数中的是一个
- exception :错误对象
- 执行顺序:按照注册的顺序倒序执行
- 返回值
- None :正常流程,错误交给django处理
- HttpResponse 对象 :下一个中间件中的process_exception方法执行,执行所有中间件的process_response方法
process_template_response(self,request,response)
def process_template_response(self, request, response): return response 参数: request 请求对象 跟视图函数中的request一样 response 视图返回的响应对象 执行时间(触发条件): 视图返回的对象是TemplateResponse,或者Response对象有render方法 执行顺序: 按照注册的顺序 倒叙执行 返回值: HttpResponse对象 必须返回