Django - 记录每个请求的响应
Django - Log response for each request
我有一个 API 使用 Django 框架构建的。每次请求到达 API.
时,我都必须记录以下数据点
- 请求方法
- 请求路径
- 请求对象
- 响应状态代码
- 响应延迟(如果可能)
我尝试使用 request_finished
信号,但它没有带来响应对象。我怎样才能做到这一点?
这是 Django 中间件 的工作:https://docs.djangoproject.com/en/4.0/topics/http/middleware/
安装“中间件”后,您将有机会在请求处理之前、期间和之后对所有请求进行干预。
如文档 link 中所述,您需要创建一个中间件 class,然后在 settings
的 MIDDLEWARE
列表中引用它。
基于 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
我有一个 API 使用 Django 框架构建的。每次请求到达 API.
时,我都必须记录以下数据点- 请求方法
- 请求路径
- 请求对象
- 响应状态代码
- 响应延迟(如果可能)
我尝试使用 request_finished
信号,但它没有带来响应对象。我怎样才能做到这一点?
这是 Django 中间件 的工作:https://docs.djangoproject.com/en/4.0/topics/http/middleware/
安装“中间件”后,您将有机会在请求处理之前、期间和之后对所有请求进行干预。
如文档 link 中所述,您需要创建一个中间件 class,然后在 settings
的 MIDDLEWARE
列表中引用它。
基于 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