Skip to content

Commit 8ccfc27

Browse files
authored
add support for LoginRequiredMiddleware, login_not_required decorator (#2005)
1 parent e3f2418 commit 8ccfc27

File tree

7 files changed

+61
-0
lines changed

7 files changed

+61
-0
lines changed

debug_toolbar/_compat.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
try:
2+
from django.contrib.auth.decorators import login_not_required
3+
except ImportError:
4+
# For Django < 5.1, copy the current Django implementation
5+
def login_not_required(view_func):
6+
"""
7+
Decorator for views that allows access to unauthenticated requests.
8+
"""
9+
view_func.login_required = False
10+
return view_func

debug_toolbar/panels/history/views.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from django.http import HttpResponseBadRequest, JsonResponse
22
from django.template.loader import render_to_string
33

4+
from debug_toolbar._compat import login_not_required
45
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
56
from debug_toolbar.panels.history.forms import HistoryStoreForm
67
from debug_toolbar.toolbar import DebugToolbar
78

89

10+
@login_not_required
911
@require_show_toolbar
1012
@render_with_toolbar_language
1113
def history_sidebar(request):
@@ -37,6 +39,7 @@ def history_sidebar(request):
3739
return HttpResponseBadRequest("Form errors")
3840

3941

42+
@login_not_required
4043
@require_show_toolbar
4144
@render_with_toolbar_language
4245
def history_refresh(request):

debug_toolbar/panels/sql/views.py

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django.template.loader import render_to_string
33
from django.views.decorators.csrf import csrf_exempt
44

5+
from debug_toolbar._compat import login_not_required
56
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
67
from debug_toolbar.forms import SignedDataForm
78
from debug_toolbar.panels.sql.forms import SQLSelectForm
@@ -17,6 +18,7 @@ def get_signed_data(request):
1718

1819

1920
@csrf_exempt
21+
@login_not_required
2022
@require_show_toolbar
2123
@render_with_toolbar_language
2224
def sql_select(request):
@@ -47,6 +49,7 @@ def sql_select(request):
4749

4850

4951
@csrf_exempt
52+
@login_not_required
5053
@require_show_toolbar
5154
@render_with_toolbar_language
5255
def sql_explain(request):
@@ -86,6 +89,7 @@ def sql_explain(request):
8689

8790

8891
@csrf_exempt
92+
@login_not_required
8993
@require_show_toolbar
9094
@render_with_toolbar_language
9195
def sql_profile(request):

debug_toolbar/panels/templates/views.py

+2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
from django.template.loader import render_to_string
66
from django.utils.html import format_html, mark_safe
77

8+
from debug_toolbar._compat import login_not_required
89
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
910

1011

12+
@login_not_required
1113
@require_show_toolbar
1214
@render_with_toolbar_language
1315
def template_source(request):

debug_toolbar/views.py

+2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
from django.utils.html import escape
33
from django.utils.translation import gettext as _
44

5+
from debug_toolbar._compat import login_not_required
56
from debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar
67
from debug_toolbar.toolbar import DebugToolbar
78

89

10+
@login_not_required
911
@require_show_toolbar
1012
@render_with_toolbar_language
1113
def render_panel(request):

docs/changes.rst

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Pending
1111
`Google Summer of Code Project 2024
1212
<https://summerofcode.withgoogle.com/programs/2024/projects/iXVvyGYp>`__.
1313
* Added Django 5.1 to the CI matrix.
14+
* Added support for the ``LoginRequiredMiddleware`` introduced in Django 5.1.
1415
* Support select and explain buttons for ``UNION`` queries on PostgreSQL.
1516
* Fixed internal toolbar requests being instrumented if the Django setting
1617
``FORCE_SCRIPT_NAME`` was set.

tests/test_login_not_required.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import unittest
2+
3+
import django
4+
from django.test import SimpleTestCase, override_settings
5+
from django.urls import reverse
6+
7+
8+
@unittest.skipIf(
9+
django.VERSION < (5, 1),
10+
"Valid on Django 5.1 and above, requires LoginRequiredMiddleware",
11+
)
12+
@override_settings(
13+
DEBUG=True,
14+
MIDDLEWARE=[
15+
"django.contrib.sessions.middleware.SessionMiddleware",
16+
"django.contrib.auth.middleware.AuthenticationMiddleware",
17+
"django.contrib.auth.middleware.LoginRequiredMiddleware",
18+
"debug_toolbar.middleware.DebugToolbarMiddleware",
19+
],
20+
)
21+
class LoginNotRequiredTestCase(SimpleTestCase):
22+
def test_panels(self):
23+
for uri in (
24+
"history_sidebar",
25+
"history_refresh",
26+
"sql_select",
27+
"sql_explain",
28+
"sql_profile",
29+
"template_source",
30+
):
31+
with self.subTest(uri=uri):
32+
response = self.client.get(reverse(f"djdt:{uri}"))
33+
self.assertNotEqual(response.status_code, 200)
34+
35+
def test_render_panel(self):
36+
response = self.client.get(
37+
reverse("djdt:render_panel"), query_params={"store_id": "store_id"}
38+
)
39+
self.assertEqual(response.status_code, 200)

0 commit comments

Comments
 (0)