mirror of
https://github.com/django/django.git
synced 2025-05-04 14:14:37 +00:00
Fixed #35354 -- Simplified ASGIRequest path handling.
Following the ASGI HTTP Connection Scope docs[0], the provided `path` is already the correct value that Django requires. In combination with `root_path`, from which `script_name` is derived, the `path_info` variable is set. It's then redundant to re-calculate `path` from `script_name` and `path_info`. See also, a clarifying discussion on the ASGIref repo[1]. [0]: https://asgi.readthedocs.io/en/latest/specs/www.html#http-connection-scope [1]: https://github.com/django/asgiref/issues/424
This commit is contained in:
parent
4d2ef9bb82
commit
bcd255cd5c
@ -50,21 +50,13 @@ class ASGIRequest(HttpRequest):
|
|||||||
self._post_parse_error = False
|
self._post_parse_error = False
|
||||||
self._read_started = False
|
self._read_started = False
|
||||||
self.resolver_match = None
|
self.resolver_match = None
|
||||||
|
self.path = scope["path"]
|
||||||
self.script_name = get_script_prefix(scope)
|
self.script_name = get_script_prefix(scope)
|
||||||
if self.script_name:
|
if self.script_name:
|
||||||
# TODO: Better is-prefix checking, slash handling?
|
# TODO: Better is-prefix checking, slash handling?
|
||||||
self.path_info = scope["path"].removeprefix(self.script_name)
|
self.path_info = scope["path"].removeprefix(self.script_name)
|
||||||
else:
|
else:
|
||||||
self.path_info = scope["path"]
|
self.path_info = scope["path"]
|
||||||
# The Django path is different from ASGI scope path args, it should
|
|
||||||
# combine with script name.
|
|
||||||
if self.script_name:
|
|
||||||
self.path = "%s/%s" % (
|
|
||||||
self.script_name.rstrip("/"),
|
|
||||||
self.path_info.replace("/", "", 1),
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.path = scope["path"]
|
|
||||||
# HTTP basics.
|
# HTTP basics.
|
||||||
self.method = self.scope["method"].upper()
|
self.method = self.scope["method"].upper()
|
||||||
# Ensure query string is encoded correctly.
|
# Ensure query string is encoded correctly.
|
||||||
|
@ -335,11 +335,13 @@ class AsyncHandlerRequestTests(SimpleTestCase):
|
|||||||
self.assertEqual(request.script_name, "/root")
|
self.assertEqual(request.script_name, "/root")
|
||||||
self.assertEqual(request.path_info, "/somepath/")
|
self.assertEqual(request.path_info, "/somepath/")
|
||||||
|
|
||||||
@override_settings(FORCE_SCRIPT_NAME="/FORCED_PREFIX/")
|
@override_settings(FORCE_SCRIPT_NAME="/FORCED_PREFIX")
|
||||||
def test_force_script_name(self):
|
def test_force_script_name(self):
|
||||||
async_request_factory = AsyncRequestFactory()
|
async_request_factory = AsyncRequestFactory()
|
||||||
request = async_request_factory.request(**{"path": "/somepath/"})
|
request = async_request_factory.request(**{"path": "/FORCED_PREFIX/somepath/"})
|
||||||
self.assertEqual(request.path, "/FORCED_PREFIX/somepath/")
|
self.assertEqual(request.path, "/FORCED_PREFIX/somepath/")
|
||||||
|
self.assertEqual(request.script_name, "/FORCED_PREFIX")
|
||||||
|
self.assertEqual(request.path_info, "/somepath/")
|
||||||
|
|
||||||
async def test_sync_streaming(self):
|
async def test_sync_streaming(self):
|
||||||
response = await self.async_client.get("/streaming/")
|
response = await self.async_client.get("/streaming/")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user