django 中间件
在主目录下创建了一个middleware.py的文件;
不使用中间件定义的方法
get_response 会跳过默写中间件的方法
import logginglogger = logging.getLogger(__name__)class CountRequestMiddleware():def __init__(self, get_response):self.get_response = get_responseself.count_request = 0self.count_exceptions = 0def __call__(self,request, *args, **kwargs):self.count_request += 1logger.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 HttpResponselogger = 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 Nonedef process_template_response(self, request, response):print("my process_template_response")return responsedef process_response(self, request, response):print("my process_response")print(f"[{response.status_code}] {request.path} - 离开中间件")return responsedef process_exception(exception):print("my process_template_response")return HttpResponse(exception)
注册中间件:
将自定义的中间件类注册到settings.py中间件中,把自定义的中间件的类添加到MIDLEWARE的列表当中
可参照 Django 中间件开发完全指南_中间件如何开发-CSDN博客
Django中中间件学习之如何使用自定义中间件-腾讯云开发者社区-腾讯云