在主目录下创建了一个middleware.py的文件;
不使用中间件定义的方法
get_response 会跳过默写中间件的方法
import logging
logger = logging.getLogger(__name__)
class CountRequestMiddleware():
def __init__(self, get_response):
self.get_response = get_response
self.count_request = 0
self.count_exceptions = 0
def __call__(self,request, *args, **kwargs):
self.count_request += 1
logger.info(f"Handle {self.count_request} requests so far")
return self.get_response(request)
使用中间件定义的方法
中间件中可以定义5个方法,分别是:
-
process_request(self,request) : 执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
-
process_view(self, request, callback, callback_args, callback_kwargs): 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
-
process_template_response(self,request,response): 在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
-
process_exception(self, request, exception) 当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
-
process_response(self, request, response) 所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
import logging
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
logger = logging.getLogger(__name__)
class CountRequestMiddleware(MiddlewareMixin):
def process_request(self, request):
print("my process_request")
print(f"[{request.method}] {request.path} - 进入中间件")
def process_view(self, request, callback, callback_args, callback_kwargs):
print("my process_view")
return None
def process_template_response(self, request, response):
print("my process_template_response")
return response
def process_response(self, request, response):
print("my process_response")
print(f"[{response.status_code}] {request.path} - 离开中间件")
return response
def process_exception(exception):
print("my process_template_response")
return HttpResponse(exception)
注册中间件:
将自定义的中间件类注册到settings.py中间件中,把自定义的中间件的类添加到MIDLEWARE的列表当中