1.在app中新建文件 middleware.py
import time
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
# 定义中间件,统计响应时间
class TimeCountMiddleware(MiddlewareMixin):
# 进入的第一个方法
def process_request(self, request):
self.start_time = time.time() # 记录进入中间件时间
return
# 执行视图函数
def process_view(self, request, func, *args, **kwargs):
if request.path != reverse('index'):
return None
start = time.time() # 执行视图函数前的时间
response = func(request)
costed = time.time() - start # 整个视图函数的执行时间
print('执行view方法花费时间:{:.2f}s'.format(costed))
return response
def process_exception(self, request, exception):
pass
# 模板渲染时进入的方法,可在此处对response进行操作,如设置headers
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
costed = time.time() - self.start_time
print('一次请求的响应时间:{:.2f}s'.format(costed))
return response
2.注册中间件
MIDDLEWARE = [
'student.middleware.TimeCountMiddleware',
'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',
]
3.方法说明
1.process_request
请求到达中间件后的第一个方法,可以做一些校验,如用户登陆和请求头
返回值有两种:1)None:Django会继续执行其他方法;2)HttpResponse那么接下来只会执行process_response,其他方法将不会执行,并且若此中间件为第一个,那剩下的中间件也不会执行
2.process_view
中间件中第二个执行的方法,参数func为要执行的视图函数,若返回None则django会自动执行视图函数,从而得到最终的response
3.process_template_response
使用模板时会来到这个方法,可以对response做一些操作,比如设置Content-Type,修改或添加header
4.process_response
同上,只是不走模板时来这
5.process_exception
发生异常时进入次方法,如果在process_view中手动调用了func,则不会触发此方法。此方法接受到异常后可以选择处理,然后返回一个含有异常信息的HttpResponse,或者直接返回None不处理,此时django会使用自己的异常模板