diff --git a/debug_toolbar/decorators.py b/debug_toolbar/decorators.py index 2abfb22f9..3d83147b1 100644 --- a/debug_toolbar/decorators.py +++ b/debug_toolbar/decorators.py @@ -32,4 +32,8 @@ def inner(request, *args, **kwargs): ) return HttpResponseBadRequest("Invalid signature") + # We have changed the signature, so need to remove `__wrapped__` to + # avoid confusing type checking tools + del inner.__wrapped__ + return inner diff --git a/tests/test_utils.py b/tests/test_utils.py index 31a67a6c1..38c8b8073 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,8 +1,10 @@ +import inspect import unittest from django.test import override_settings import debug_toolbar.utils +from debug_toolbar.decorators import signed_data_view from debug_toolbar.utils import ( get_name_from_obj, get_stack, @@ -80,3 +82,22 @@ def test_deprecated_functions(self): with self.assertWarns(DeprecationWarning): stack_trace = tidy_stacktrace(reversed(stack)) self.assertEqual(stack_trace[-1][0], __file__) + + +class DecoratorsTestCase(unittest.TestCase): + def test_signed_data_view_signature(self): + # Ensure signed_data_view decorator sets an appropriate signature + + # This matters only to tools that type-check the URLconf, (e.g. + # django-urlconfchecks), to avoid the nuisance of those tools flagging + # django-debug-toolbar views as incorrectly typed. + + def some_view(request, verified_data): + pass + + decorated_view = signed_data_view(some_view) + + # `verified_data` is a parameter to some_view: + self.assertIn("verified_data", inspect.signature(some_view).parameters) + # but not to the decorated_view: + self.assertNotIn("verified_data", inspect.signature(decorated_view).parameters)