From a35ac447a795ab0780d7be9ac53e61e75d8ab3d6 Mon Sep 17 00:00:00 2001 From: denisSurkov Date: Sat, 6 Jul 2024 15:10:14 +0500 Subject: [PATCH 1/3] Add warning async is not supported --- debug_toolbar/middleware.py | 18 +++++++++++++ docs/changes.rst | 1 + tests/test_integration.py | 51 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 65b5282c5..8cdffcfc2 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -13,6 +13,11 @@ from debug_toolbar.toolbar import DebugToolbar from debug_toolbar.utils import clear_stack_trace_caches +try: + from django.core.handlers.asgi import ASGIRequest +except ImportError: + ASGIRequest = None + _HTML_TYPES = ("text/html", "application/xhtml+xml") @@ -73,6 +78,10 @@ def __call__(self, request): if not show_toolbar(request) or DebugToolbar.is_toolbar_request(request): return self.get_response(request) + if self._check_async_request(request): + self._show_async_request_is_not_supported() + return self.get_response(request) + toolbar = DebugToolbar(request, self.get_response) # Activate instrumentation ie. monkey-patch. @@ -133,3 +142,12 @@ def get_headers(request, panels): else: headers[header] = value return headers + + def _check_async_request(self, request) -> bool: + return type(request) == ASGIRequest + + @staticmethod + def _show_async_request_is_not_supported(): + print("-" * 10) + print("Be caution, django-debug-toolbar does not support async requests!") + print("-" * 10) diff --git a/docs/changes.rst b/docs/changes.rst index d47f69784..428842372 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -6,6 +6,7 @@ Pending * Changed ordering (and grammatical number) of panels and their titles in documentation to match actual panel ordering and titles. +* Added warning "async is not supported" 4.4.5 (2024-07-05) ------------------ diff --git a/tests/test_integration.py b/tests/test_integration.py index 95207c21b..3339a3fb1 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -1,5 +1,7 @@ +import io import os import re +import sys import time import unittest from unittest.mock import patch @@ -33,6 +35,12 @@ webdriver = None +try: + from django.test import AsyncRequestFactory +except ImportError: + AsyncRequestFactory = None + + rf = RequestFactory() @@ -843,3 +851,46 @@ def test_theme_toggle(self): self.get("/regular/basic/") toolbar = self.selenium.find_element(By.ID, "djDebug") self.assertEqual(toolbar.get_attribute("data-theme"), "light") + + +@unittest.skipUnless( + AsyncRequestFactory is not None, "Test valid only for django with async requests" +) +@override_settings(DEBUG=True) +class DebugToolbarAsyncTestCase(BaseTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.async_rf = AsyncRequestFactory() + cls.simple_get_response = lambda *args, **kwargs: HttpResponse( + "" + ) + cls._default_stdout = sys.stdout + + def setUp(self): + super().setUp() + self.captured_output = io.StringIO() + sys.stdout = self.captured_output + + @classmethod + def tearDownClass(cls): + super().tearDownClass() + sys.stdout = cls._default_stdout + + def test_do_not_render_toolbar_if_it_was_async_request(self): + captured_output = io.StringIO() + sys.stdout = captured_output + + request = self.async_rf.get("/") + response = DebugToolbarMiddleware(self.simple_get_response)(request) + + self.assertEqual(response.content, b"") + + def test_prints_warning_async_is_not_supported(self): + request = self.async_rf.get("/") + DebugToolbarMiddleware(self.simple_get_response)(request) + + assert ( + self.captured_output.getvalue() + == "----------\nBe caution, django-debug-toolbar does not support async requests!\n----------\n" + ) From 2989e9f25aa4519b88662b573a159b030255ded3 Mon Sep 17 00:00:00 2001 From: denisSurkov Date: Sat, 6 Jul 2024 16:25:50 +0500 Subject: [PATCH 2/3] Fix import and removed useless skipUnless --- tests/test_integration.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 3339a3fb1..c6f8f9f15 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -13,7 +13,7 @@ from django.db import connection from django.http import HttpResponse from django.template.loader import get_template -from django.test import RequestFactory +from django.test import RequestFactory, AsyncRequestFactory from django.test.utils import override_settings from debug_toolbar.forms import SignedDataForm @@ -35,12 +35,6 @@ webdriver = None -try: - from django.test import AsyncRequestFactory -except ImportError: - AsyncRequestFactory = None - - rf = RequestFactory() @@ -853,9 +847,6 @@ def test_theme_toggle(self): self.assertEqual(toolbar.get_attribute("data-theme"), "light") -@unittest.skipUnless( - AsyncRequestFactory is not None, "Test valid only for django with async requests" -) @override_settings(DEBUG=True) class DebugToolbarAsyncTestCase(BaseTestCase): @classmethod From 53eaef7b401886ed34acc6e84fede01d8276109f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 11:26:03 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index c6f8f9f15..9a0e826b0 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -13,7 +13,7 @@ from django.db import connection from django.http import HttpResponse from django.template.loader import get_template -from django.test import RequestFactory, AsyncRequestFactory +from django.test import AsyncRequestFactory, RequestFactory from django.test.utils import override_settings from debug_toolbar.forms import SignedDataForm