django 中间件

在主目录下创建了一个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个方法,分别是:

  1. process_request(self,request) : 执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象

  2. process_view(self, request, callback, callback_args, callback_kwargs): 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象

  3. process_template_response(self,request,response): 在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象

  4. process_exception(self, request, exception) 当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象

  5. 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的列表当中

可参照 Django 中间件开发完全指南_中间件如何开发-CSDN博客

Django中中间件学习之如何使用自定义中间件-腾讯云开发者社区-腾讯云

你可能感兴趣的:(django 中间件)