summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Woodruff <github@benjam.info>2019-05-06 16:53:40 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-07-03 11:37:28 +0200
commit54dcfbc36780054d39299bfd1078938e5dd4e839 (patch)
tree6e5f7744dc1d8cf5b41f71d5374a1206b4ceacc2
parent55b68de643b5c2d5f0a8ea7587ab3b2966021ccc (diff)
Fixed #29744 -- Fixed caching of URLResolver for a default URLconf.
get_resolver() for a default URLconf (passing no argument) and for settings.ROOT_URLCONF should return the same cached object.
-rw-r--r--django/urls/base.py4
-rw-r--r--django/urls/resolvers.py6
-rw-r--r--tests/urlpatterns/test_resolvers.py12
3 files changed, 18 insertions, 4 deletions
diff --git a/django/urls/base.py b/django/urls/base.py
index 0e1c3d909c..dd9b2e4c22 100644
--- a/django/urls/base.py
+++ b/django/urls/base.py
@@ -7,7 +7,7 @@ from django.utils.functional import lazy
from django.utils.translation import override
from .exceptions import NoReverseMatch, Resolver404
-from .resolvers import get_ns_resolver, get_resolver
+from .resolvers import _get_cached_resolver, get_ns_resolver, get_resolver
from .utils import get_callable
# SCRIPT_NAME prefixes for each thread are stored here. If there's no entry for
@@ -92,7 +92,7 @@ reverse_lazy = lazy(reverse, str)
def clear_url_caches():
get_callable.cache_clear()
- get_resolver.cache_clear()
+ _get_cached_resolver.cache_clear()
get_ns_resolver.cache_clear()
diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py
index 247e3680c0..2154a46320 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -63,10 +63,14 @@ class ResolverMatch:
)
-@functools.lru_cache(maxsize=None)
def get_resolver(urlconf=None):
if urlconf is None:
urlconf = settings.ROOT_URLCONF
+ return _get_cached_resolver(urlconf)
+
+
+@functools.lru_cache(maxsize=None)
+def _get_cached_resolver(urlconf=None):
return URLResolver(RegexPattern(r'^/'), urlconf)
diff --git a/tests/urlpatterns/test_resolvers.py b/tests/urlpatterns/test_resolvers.py
index a32e8edaf7..eaca6096d9 100644
--- a/tests/urlpatterns/test_resolvers.py
+++ b/tests/urlpatterns/test_resolvers.py
@@ -1,5 +1,6 @@
from django.test import SimpleTestCase
-from django.urls.resolvers import RegexPattern, RoutePattern
+from django.test.utils import override_settings
+from django.urls.resolvers import RegexPattern, RoutePattern, get_resolver
from django.utils.translation import gettext_lazy as _
@@ -13,3 +14,12 @@ class RoutePatternTests(SimpleTestCase):
def test_str(self):
self.assertEqual(str(RoutePattern(_('translated/'))), 'translated/')
+
+
+class ResolverCacheTests(SimpleTestCase):
+ @override_settings(ROOT_URLCONF='urlpatterns.path_urls')
+ def test_resolver_cache_default__root_urlconf(self):
+ # resolver for a default URLconf (passing no argument) and for the
+ # settings.ROOT_URLCONF is the same cached object.
+ self.assertIs(get_resolver(), get_resolver('urlpatterns.path_urls'))
+ self.assertIsNot(get_resolver(), get_resolver('urlpatterns.path_dynamic_urls'))