Skip to content

Commit a35ac44

Browse files
committed
Add warning async is not supported
1 parent 699c1d9 commit a35ac44

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

debug_toolbar/middleware.py

+18
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
from debug_toolbar.toolbar import DebugToolbar
1414
from debug_toolbar.utils import clear_stack_trace_caches
1515

16+
try:
17+
from django.core.handlers.asgi import ASGIRequest
18+
except ImportError:
19+
ASGIRequest = None
20+
1621
_HTML_TYPES = ("text/html", "application/xhtml+xml")
1722

1823

@@ -73,6 +78,10 @@ def __call__(self, request):
7378
if not show_toolbar(request) or DebugToolbar.is_toolbar_request(request):
7479
return self.get_response(request)
7580

81+
if self._check_async_request(request):
82+
self._show_async_request_is_not_supported()
83+
return self.get_response(request)
84+
7685
toolbar = DebugToolbar(request, self.get_response)
7786

7887
# Activate instrumentation ie. monkey-patch.
@@ -133,3 +142,12 @@ def get_headers(request, panels):
133142
else:
134143
headers[header] = value
135144
return headers
145+
146+
def _check_async_request(self, request) -> bool:
147+
return type(request) == ASGIRequest
148+
149+
@staticmethod
150+
def _show_async_request_is_not_supported():
151+
print("-" * 10)
152+
print("Be caution, django-debug-toolbar does not support async requests!")
153+
print("-" * 10)

docs/changes.rst

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Pending
66

77
* Changed ordering (and grammatical number) of panels and their titles in
88
documentation to match actual panel ordering and titles.
9+
* Added warning "async is not supported"
910

1011
4.4.5 (2024-07-05)
1112
------------------

tests/test_integration.py

+51
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import io
12
import os
23
import re
4+
import sys
35
import time
46
import unittest
57
from unittest.mock import patch
@@ -33,6 +35,12 @@
3335
webdriver = None
3436

3537

38+
try:
39+
from django.test import AsyncRequestFactory
40+
except ImportError:
41+
AsyncRequestFactory = None
42+
43+
3644
rf = RequestFactory()
3745

3846

@@ -843,3 +851,46 @@ def test_theme_toggle(self):
843851
self.get("/regular/basic/")
844852
toolbar = self.selenium.find_element(By.ID, "djDebug")
845853
self.assertEqual(toolbar.get_attribute("data-theme"), "light")
854+
855+
856+
@unittest.skipUnless(
857+
AsyncRequestFactory is not None, "Test valid only for django with async requests"
858+
)
859+
@override_settings(DEBUG=True)
860+
class DebugToolbarAsyncTestCase(BaseTestCase):
861+
@classmethod
862+
def setUpClass(cls):
863+
super().setUpClass()
864+
cls.async_rf = AsyncRequestFactory()
865+
cls.simple_get_response = lambda *args, **kwargs: HttpResponse(
866+
"<html><body></body></html>"
867+
)
868+
cls._default_stdout = sys.stdout
869+
870+
def setUp(self):
871+
super().setUp()
872+
self.captured_output = io.StringIO()
873+
sys.stdout = self.captured_output
874+
875+
@classmethod
876+
def tearDownClass(cls):
877+
super().tearDownClass()
878+
sys.stdout = cls._default_stdout
879+
880+
def test_do_not_render_toolbar_if_it_was_async_request(self):
881+
captured_output = io.StringIO()
882+
sys.stdout = captured_output
883+
884+
request = self.async_rf.get("/")
885+
response = DebugToolbarMiddleware(self.simple_get_response)(request)
886+
887+
self.assertEqual(response.content, b"<html><body></body></html>")
888+
889+
def test_prints_warning_async_is_not_supported(self):
890+
request = self.async_rf.get("/")
891+
DebugToolbarMiddleware(self.simple_get_response)(request)
892+
893+
assert (
894+
self.captured_output.getvalue()
895+
== "----------\nBe caution, django-debug-toolbar does not support async requests!\n----------\n"
896+
)

0 commit comments

Comments
 (0)