From 64fc6c5d0ecd55c94ceb2cbe6724895663cfd91c Mon Sep 17 00:00:00 2001 From: Bruno Alla Date: Wed, 27 Nov 2024 23:42:39 +0100 Subject: [PATCH] Make RequestLoggingMiddleware async capable --- django_datadog_logger/middleware/request_log.py | 16 ++++++++++++++++ requirements.txt | 1 + 2 files changed, 17 insertions(+) diff --git a/django_datadog_logger/middleware/request_log.py b/django_datadog_logger/middleware/request_log.py index be0f925..38ed784 100644 --- a/django_datadog_logger/middleware/request_log.py +++ b/django_datadog_logger/middleware/request_log.py @@ -1,20 +1,36 @@ import logging import time +from asgiref.sync import iscoroutinefunction, markcoroutinefunction from rest_framework.utils.serializer_helpers import ReturnDict logger = logging.getLogger(__name__) class RequestLoggingMiddleware: + sync_capable = True + async_capable = True + def __init__(self, get_response=None): self.get_response = get_response + self.async_mode = iscoroutinefunction(self.get_response) + if self.async_mode: + # Mark the class as async-capable, but do the actual switch + # inside __call__ to avoid swapping out dunder methods + markcoroutinefunction(self) def __call__(self, request): + if self.async_mode: + return self.__acall__(request) response = self.get_response(request) self.log_response(request, response) return response + async def __acall__(self, request): + response = await self.get_response(request) + self.log_response(request, response) + return response + def process_response(self, request, response): self.log_response(request, response) return response diff --git a/requirements.txt b/requirements.txt index 0c65ada..2cac849 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ JSON-log-formatter Django +asgiref djangorestframework backports.zoneinfo;python_version<"3.9"