Django - 记录每个请求的响应

Django - Log response for each request

我有一个 API 使用 Django 框架构建的。每次请求到达 API.

时,我都必须记录以下数据点
  1. 请求方法
  2. 请求路径
  3. 请求对象
  4. 响应状态代码
  5. 响应延迟(如果可能)

我尝试使用 request_finished 信号,但它没有带来响应对象。我怎样才能做到这一点?

这是 Django 中间件 的工作:https://docs.djangoproject.com/en/4.0/topics/http/middleware/

安装“中间件”后,您将有机会在请求处理之前、期间和之后对所有请求进行干预。

如文档 link 中所述,您需要创建一个中间件 class,然后在 settingsMIDDLEWARE 列表中引用它。

基于 class 的中间件非常简单,但更灵活(轻松保持状态并拥有自己的方法)。像这样:

class LogRequestsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start = time.perf_counter()
        response = self.get_response(request)
        end = time.perf_counter()
        self.log(request, start, end)
        return response

    def log(self, request, start, end):
        # log request.method, request.path_info, etc.
        # log end - start for duration

此设置中还有其他挂钩,但您不需要它们。即使存在未捕获的异常,Django 也会对其进行处理,并且仍然 return 一个响应对象(来自 get_response)供您阅读。

请记住,这与您在视图中获得的请求对象不同。它是 django.core.handlers.wsgi.WSGIRequest 的一个实例,但您要查找的那些值应该都在那里。

要计算延迟,您可以在 __call__ 方法处理请求之前和之后从 time.perf_counter() 中获取值,区别在于持续时间:

elapsed = time.perf_counter()  # Includes time elapsed during sleep system-wide
duration = time.process_time()  # Process time not including sleep