summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Howard <git@theorangeone.net>2024-06-10 17:32:08 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-05-13 12:05:58 +0100
commitf920937c8a63df6bea220e4386f59cdb45b2e355 (patch)
tree8c36cb3d9f585a44f6412d8d55cff50c0d2a092b
parentf66c79e93d41d2cd32be244170b54080c0796584 (diff)
Fixed #35518 -- Optimized RoutePattern by using string operations for converter-less routes.
-rw-r--r--django/urls/resolvers.py30
-rw-r--r--tests/urlpatterns/test_resolvers.py6
2 files changed, 25 insertions, 11 deletions
diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py
index 3d3bbfd38a..13043835dd 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -322,17 +322,25 @@ 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
+ # Only use regex overhead if there are converters.
+ if self.converters:
+ if match := self.regex.search(path):
+ # 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 this is an endpoint, the path should be exactly the same as the route.
+ elif self._is_endpoint:
+ 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):
diff --git a/tests/urlpatterns/test_resolvers.py b/tests/urlpatterns/test_resolvers.py
index cb831bbe1c..99b2f9154c 100644
--- a/tests/urlpatterns/test_resolvers.py
+++ b/tests/urlpatterns/test_resolvers.py
@@ -13,6 +13,12 @@ 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")