Skip to content

Commit ee258fc

Browse files
dmartinmatthiask
authored andcommitted
Use path_info when resolving requests
Maintains support for `SCRIPT_NAME` without manually calling `get_script_prefix()`. Tests that involved manually setting the `path` attribute of a request have been reworked to use a `RequestFactory` so that the `path` and `path_info` attributes are both set appropriately.
1 parent 23bb473 commit ee258fc

File tree

4 files changed

+38
-40
lines changed

4 files changed

+38
-40
lines changed

debug_toolbar/panels/request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def generate_stats(self, request, response):
4141
"view_urlname": "None",
4242
}
4343
try:
44-
match = resolve(request.path)
44+
match = resolve(request.path_info)
4545
func, args, kwargs = match
4646
view_info["view_func"] = get_name_from_obj(func)
4747
view_info["view_args"] = args

debug_toolbar/toolbar.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from django.dispatch import Signal
1414
from django.template import TemplateSyntaxError
1515
from django.template.loader import render_to_string
16-
from django.urls import get_script_prefix, include, path, re_path, resolve
16+
from django.urls import include, path, re_path, resolve
1717
from django.urls.exceptions import Resolver404
1818
from django.utils.module_loading import import_string
1919
from django.utils.translation import get_language, override as lang_override
@@ -165,8 +165,7 @@ def is_toolbar_request(cls, request):
165165
# not have resolver_match set.
166166
try:
167167
resolver_match = request.resolver_match or resolve(
168-
request.path.replace(get_script_prefix(), "/", 1),
169-
getattr(request, "urlconf", None),
168+
request.path_info, getattr(request, "urlconf", None)
170169
)
171170
except Resolver404:
172171
return False

tests/panels/test_request.py

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from django.http import QueryDict
2+
from django.test import RequestFactory
23

34
from ..base import BaseTestCase
45

6+
rf = RequestFactory()
7+
58

69
class RequestPanelTestCase(BaseTestCase):
710
panel_id = "RequestPanel"
@@ -13,21 +16,21 @@ def test_non_ascii_session(self):
1316
self.assertIn("où", self.panel.content)
1417

1518
def test_object_with_non_ascii_repr_in_request_params(self):
16-
self.request.path = "/non_ascii_request/"
17-
response = self.panel.process_request(self.request)
18-
self.panel.generate_stats(self.request, response)
19+
request = rf.get("/non_ascii_request/")
20+
response = self.panel.process_request(request)
21+
self.panel.generate_stats(request, response)
1922
self.assertIn("nôt åscíì", self.panel.content)
2023

2124
def test_insert_content(self):
2225
"""
2326
Test that the panel only inserts content after generate_stats and
2427
not the process_request.
2528
"""
26-
self.request.path = "/non_ascii_request/"
27-
response = self.panel.process_request(self.request)
29+
request = rf.get("/non_ascii_request/")
30+
response = self.panel.process_request(request)
2831
# ensure the panel does not have content yet.
2932
self.assertNotIn("nôt åscíì", self.panel.content)
30-
self.panel.generate_stats(self.request, response)
33+
self.panel.generate_stats(request, response)
3134
# ensure the panel renders correctly.
3235
content = self.panel.content
3336
self.assertIn("nôt åscíì", content)
@@ -99,9 +102,9 @@ def test_list_for_request_in_method_post(self):
99102
self.assertIn("[{'a': 1}, {'b': 2}]", content)
100103

101104
def test_namespaced_url(self):
102-
self.request.path = "/admin/login/"
103-
response = self.panel.process_request(self.request)
104-
self.panel.generate_stats(self.request, response)
105+
request = rf.get("/admin/login/")
106+
response = self.panel.process_request(request)
107+
self.panel.generate_stats(request, response)
105108
panel_stats = self.panel.get_stats()
106109
self.assertEqual(panel_stats["view_urlname"], "admin:login")
107110

tests/test_integration.py

+23-27
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ def test_should_render_panels_multiprocess(self):
128128

129129
def _resolve_stats(self, path):
130130
# takes stats from Request panel
131-
self.request.path = path
131+
request = rf.get(path)
132132
panel = self.toolbar.get_panel_by_id("RequestPanel")
133-
response = panel.process_request(self.request)
134-
panel.generate_stats(self.request, response)
133+
response = panel.process_request(request)
134+
panel.generate_stats(request, response)
135135
return panel.get_stats()
136136

137137
def test_url_resolving_positional(self):
@@ -215,52 +215,48 @@ def test_cache_disable_instrumentation(self):
215215
self.assertEqual(len(response.toolbar.get_panel_by_id("CachePanel").calls), 0)
216216

217217
def test_is_toolbar_request(self):
218-
self.request.path = "/__debug__/render_panel/"
219-
self.assertTrue(self.toolbar.is_toolbar_request(self.request))
218+
request = rf.get("/__debug__/render_panel/")
219+
self.assertTrue(self.toolbar.is_toolbar_request(request))
220220

221-
self.request.path = "/invalid/__debug__/render_panel/"
222-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
221+
request = rf.get("/invalid/__debug__/render_panel/")
222+
self.assertFalse(self.toolbar.is_toolbar_request(request))
223223

224-
self.request.path = "/render_panel/"
225-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
224+
request = rf.get("/render_panel/")
225+
self.assertFalse(self.toolbar.is_toolbar_request(request))
226226

227227
@override_settings(ROOT_URLCONF="tests.urls_invalid")
228228
def test_is_toolbar_request_without_djdt_urls(self):
229229
"""Test cases when the toolbar urls aren't configured."""
230-
self.request.path = "/__debug__/render_panel/"
231-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
230+
request = rf.get("/__debug__/render_panel/")
231+
self.assertFalse(self.toolbar.is_toolbar_request(request))
232232

233-
self.request.path = "/render_panel/"
234-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
233+
request = rf.get("/render_panel/")
234+
self.assertFalse(self.toolbar.is_toolbar_request(request))
235235

236236
@override_settings(ROOT_URLCONF="tests.urls_invalid")
237237
def test_is_toolbar_request_override_request_urlconf(self):
238238
"""Test cases when the toolbar URL is configured on the request."""
239-
self.request.path = "/__debug__/render_panel/"
240-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
239+
request = rf.get("/__debug__/render_panel/")
240+
self.assertFalse(self.toolbar.is_toolbar_request(request))
241241

242242
# Verify overriding the urlconf on the request is valid.
243-
self.request.urlconf = "tests.urls"
244-
self.request.path = "/__debug__/render_panel/"
245-
self.assertTrue(self.toolbar.is_toolbar_request(self.request))
243+
request.urlconf = "tests.urls"
244+
self.assertTrue(self.toolbar.is_toolbar_request(request))
246245

247-
@patch("debug_toolbar.toolbar.get_script_prefix", return_value="/path/")
248-
def test_is_toolbar_request_with_script_prefix(self, mocked_get_script_prefix):
246+
def test_is_toolbar_request_with_script_prefix(self):
249247
"""
250248
Test cases when Django is running under a path prefix, such as via the
251249
FORCE_SCRIPT_NAME setting.
252250
"""
253-
self.request.path = "/path/__debug__/render_panel/"
254-
self.assertTrue(self.toolbar.is_toolbar_request(self.request))
251+
request = rf.get("/__debug__/render_panel/", SCRIPT_NAME="/path/")
252+
self.assertTrue(self.toolbar.is_toolbar_request(request))
255253

256-
self.request.path = "/path/invalid/__debug__/render_panel/"
257-
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
254+
request = rf.get("/invalid/__debug__/render_panel/", SCRIPT_NAME="/path/")
255+
self.assertFalse(self.toolbar.is_toolbar_request(request))
258256

259-
self.request.path = "/path/render_panel/"
257+
request = rf.get("/render_panel/", SCRIPT_NAME="/path/")
260258
self.assertFalse(self.toolbar.is_toolbar_request(self.request))
261259

262-
self.assertEqual(mocked_get_script_prefix.call_count, 3)
263-
264260
def test_data_gone(self):
265261
response = self.client.get(
266262
"/__debug__/render_panel/?store_id=GONE&panel_id=RequestPanel"

0 commit comments

Comments
 (0)