Skip to content

Commit

Permalink
Merge pull request #413 from jrobichaud/request-cancelled
Browse files Browse the repository at this point in the history
  • Loading branch information
jrobichaud committed Dec 21, 2023
2 parents 2527f47 + 9e95b62 commit 8f516c6
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
6 changes: 5 additions & 1 deletion django_structlog/middlewares/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,11 @@ def __call__(self, request):

async def __acall__(self, request):
await sync.sync_to_async(self.prepare)(request)
response = await self.get_response(request)
try:
response = await self.get_response(request)
except asyncio.CancelledError:
logger.warning("request_cancelled")
raise
await sync.sync_to_async(self.handle_response)(request, response)
return response

Expand Down
20 changes: 11 additions & 9 deletions docs/events.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@ Django's RequestMiddleware
Request Events
^^^^^^^^^^^^^^

+------------------+--------------------+----------------------------------------------------+
| Event | Type | Description |
+==================+====================+====================================================+
| request_started | INFO | Django received a request |
+------------------+--------------------+----------------------------------------------------+
| request_finished | INFO/WARNING/ERROR | request completed with status (2XX or 3XX)/4XX/5XX |
+------------------+--------------------+----------------------------------------------------+
| request_failed | ERROR | unhandled exception occurred |
+------------------+--------------------+----------------------------------------------------+
+-------------------+--------------------+----------------------------------------------------+
| Event | Type | Description |
+===================+====================+====================================================+
| request_started | INFO | Django received a request |
+-------------------+--------------------+----------------------------------------------------+
| request_finished | INFO/WARNING/ERROR | request completed with status (2XX or 3XX)/4XX/5XX |
+-------------------+--------------------+----------------------------------------------------+
| request_cancelled | WARNING | request was cancelled during async request |
+-------------------+--------------------+----------------------------------------------------+
| request_failed | ERROR | unhandled exception occurred |
+-------------------+--------------------+----------------------------------------------------+

.. _streaming_response_events:

Expand Down
22 changes: 22 additions & 0 deletions test_app/tests/middlewares/test_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,28 @@ def get_response(_response):
mock_sync_streaming_response_wrapper.assert_called_once()
self.assertEqual(response.streaming_content, mock_wrapper)

async def test_async_cancel(self):
async def async_get_response(request):
raise asyncio.CancelledError

middleware = middlewares.RequestMiddleware(async_get_response)

mock_request = Mock()
with patch(
"django_structlog.middlewares.request.RequestMiddleware.prepare"
) as mock_prepare, patch(
"django_structlog.middlewares.request.RequestMiddleware.handle_response"
) as mock_handle_response, self.assertLogs(
"django_structlog.middlewares.request", logging.WARNING
) as log_results:
with self.assertRaises(asyncio.CancelledError):
await middleware(mock_request)
mock_prepare.assert_called_once_with(mock_request)
mock_handle_response.assert_not_called()
self.assertEqual(1, len(log_results.records))
record = log_results.records[0]
self.assertEqual("request_cancelled", record.msg["event"])


class TestRequestMiddlewareRouter(TestCase):
async def test_async(self):
Expand Down

0 comments on commit 8f516c6

Please sign in to comment.