mirror of https://github.com/django/django.git
Fixed #31077 -- Made debug decorators raise TypeError if they're not called.
Django will raise an error if you forget to call the decorator.
This commit is contained in:
parent
02eff7ef60
commit
d8e2333528
|
@ -26,6 +26,12 @@ def sensitive_variables(*variables):
|
||||||
def my_function()
|
def my_function()
|
||||||
...
|
...
|
||||||
"""
|
"""
|
||||||
|
if len(variables) == 1 and callable(variables[0]):
|
||||||
|
raise TypeError(
|
||||||
|
'sensitive_variables() must be called to use it as a decorator, '
|
||||||
|
'e.g., use @sensitive_variables(), not @sensitive_variables.'
|
||||||
|
)
|
||||||
|
|
||||||
def decorator(func):
|
def decorator(func):
|
||||||
@functools.wraps(func)
|
@functools.wraps(func)
|
||||||
def sensitive_variables_wrapper(*func_args, **func_kwargs):
|
def sensitive_variables_wrapper(*func_args, **func_kwargs):
|
||||||
|
@ -61,6 +67,13 @@ def sensitive_post_parameters(*parameters):
|
||||||
def my_view(request)
|
def my_view(request)
|
||||||
...
|
...
|
||||||
"""
|
"""
|
||||||
|
if len(parameters) == 1 and callable(parameters[0]):
|
||||||
|
raise TypeError(
|
||||||
|
'sensitive_post_parameters() must be called to use it as a '
|
||||||
|
'decorator, e.g., use @sensitive_post_parameters(), not '
|
||||||
|
'@sensitive_post_parameters.'
|
||||||
|
)
|
||||||
|
|
||||||
def decorator(view):
|
def decorator(view):
|
||||||
@functools.wraps(view)
|
@functools.wraps(view)
|
||||||
def sensitive_post_parameters_wrapper(request, *args, **kwargs):
|
def sensitive_post_parameters_wrapper(request, *args, **kwargs):
|
||||||
|
|
|
@ -26,6 +26,9 @@ from django.views.debug import (
|
||||||
Path as DebugPath, cleanse_setting, default_urlconf,
|
Path as DebugPath, cleanse_setting, default_urlconf,
|
||||||
technical_404_response, technical_500_response,
|
technical_404_response, technical_500_response,
|
||||||
)
|
)
|
||||||
|
from django.views.decorators.debug import (
|
||||||
|
sensitive_post_parameters, sensitive_variables,
|
||||||
|
)
|
||||||
|
|
||||||
from ..views import (
|
from ..views import (
|
||||||
custom_exception_reporter_filter_view, index_page,
|
custom_exception_reporter_filter_view, index_page,
|
||||||
|
@ -1272,3 +1275,26 @@ class HelperFunctionTests(SimpleTestCase):
|
||||||
initial = {'login': 'cooper', 'password': 'secret'}
|
initial = {'login': 'cooper', 'password': 'secret'}
|
||||||
expected = {'login': 'cooper', 'password': CLEANSED_SUBSTITUTE}
|
expected = {'login': 'cooper', 'password': CLEANSED_SUBSTITUTE}
|
||||||
self.assertEqual(cleanse_setting('SETTING_NAME', initial), expected)
|
self.assertEqual(cleanse_setting('SETTING_NAME', initial), expected)
|
||||||
|
|
||||||
|
|
||||||
|
class DecoratorsTests(SimpleTestCase):
|
||||||
|
def test_sensitive_variables_not_called(self):
|
||||||
|
msg = (
|
||||||
|
'sensitive_variables() must be called to use it as a decorator, '
|
||||||
|
'e.g., use @sensitive_variables(), not @sensitive_variables.'
|
||||||
|
)
|
||||||
|
with self.assertRaisesMessage(TypeError, msg):
|
||||||
|
@sensitive_variables
|
||||||
|
def test_func(password):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_sensitive_post_parameters_not_called(self):
|
||||||
|
msg = (
|
||||||
|
'sensitive_post_parameters() must be called to use it as a '
|
||||||
|
'decorator, e.g., use @sensitive_post_parameters(), not '
|
||||||
|
'@sensitive_post_parameters.'
|
||||||
|
)
|
||||||
|
with self.assertRaisesMessage(TypeError, msg):
|
||||||
|
@sensitive_post_parameters
|
||||||
|
def test_func(request):
|
||||||
|
return index_page(request)
|
||||||
|
|
Loading…
Reference in New Issue