1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

Fixed #35518 -- Used simpler string operations for converter-less routes

This commit is contained in:
Jake Howard 2024-06-10 17:32:08 +01:00
parent f812b927a5
commit 762890b832
No known key found for this signature in database
GPG Key ID: 57AFB45680EDD477
2 changed files with 31 additions and 11 deletions

View File

@ -322,17 +322,30 @@ class RoutePattern(CheckURLMixin):
self.name = name
def match(self, path):
match = self.regex.search(path)
if match:
# RoutePattern doesn't allow non-named groups so args are ignored.
kwargs = match.groupdict()
for key, value in kwargs.items():
converter = self.converters[key]
try:
kwargs[key] = converter.to_python(value)
except ValueError:
return None
return path[match.end() :], (), kwargs
if self.converters:
match = self.regex.search(path)
if match:
# RoutePattern doesn't allow non-named groups so args are ignored.
kwargs = match.groupdict()
for key, value in kwargs.items():
converter = self.converters[key]
try:
kwargs[key] = converter.to_python(value)
except ValueError:
return None
return path[match.end() :], (), kwargs
else:
# If there are no converters, skip the regex overhead and
# use string operations
if self._is_endpoint:
# If this is an endpoint, the path should be
# exactly the same as the route
if self._route == path:
return "", (), {}
# If this isn't an endpoint, the path should start with the route
elif path.startswith(self._route):
return path.removeprefix(self._route), (), {}
return None
def check(self):

View File

@ -13,6 +13,13 @@ class RoutePatternTests(SimpleTestCase):
def test_str(self):
self.assertEqual(str(RoutePattern(_("translated/"))), "translated/")
def test_has_converters(self):
self.assertEqual(len(RoutePattern("translated/").converters), 0)
self.assertEqual(len(RoutePattern(_("translated/")).converters), 0)
self.assertEqual(len(RoutePattern("translated/<int:foo>").converters), 1)
self.assertEqual(len(RoutePattern(_("translated/<int:foo>")).converters), 1)
class ResolverCacheTests(SimpleTestCase):
@override_settings(ROOT_URLCONF="urlpatterns.path_urls")