summaryrefslogtreecommitdiff
path: root/django/urls
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2022-09-01 21:09:16 +0200
committerGitHub <noreply@github.com>2022-09-01 21:09:16 +0200
commit974942a75039ba43e618f6a5ff95e08b5d5176fd (patch)
tree954db3b65546eb13320cc57e814a1b5fa887bf05 /django/urls
parente64919ae54933ef4840f0e27e51d9fcfd55ecf4b (diff)
Fixed #33955, Fixed #33971 -- Reverted "Fixed #32565 -- Moved internal URLResolver view-strings mapping to admindocs."
This reverts commit 7f3cfaa12b28d15c0ca78bb692bfd6e59d17bff1. Thanks Tom Carrick and Greg Kaleka for reports.
Diffstat (limited to 'django/urls')
-rw-r--r--django/urls/resolvers.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py
index 7c0d4fd85a..9f42e2738c 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -437,6 +437,21 @@ class URLPattern:
extra_kwargs=self.default_args,
)
+ @cached_property
+ def lookup_str(self):
+ """
+ A string that identifies the view (e.g. 'path.to.view_function' or
+ 'path.to.ClassBasedView').
+ """
+ callback = self.callback
+ if isinstance(callback, functools.partial):
+ callback = callback.func
+ if hasattr(callback, "view_class"):
+ callback = callback.view_class
+ elif not hasattr(callback, "__name__"):
+ return callback.__module__ + "." + callback.__class__.__name__
+ return callback.__module__ + "." + callback.__qualname__
+
class URLResolver:
def __init__(
@@ -454,6 +469,9 @@ class URLResolver:
self._reverse_dict = {}
self._namespace_dict = {}
self._app_dict = {}
+ # set of dotted paths to all functions and classes that are used in
+ # urlpatterns
+ self._callback_strs = set()
self._populated = False
self._local = Local()
@@ -527,6 +545,7 @@ class URLResolver:
if p_pattern.startswith("^"):
p_pattern = p_pattern[1:]
if isinstance(url_pattern, URLPattern):
+ self._callback_strs.add(url_pattern.lookup_str)
bits = normalize(url_pattern.pattern.regex.pattern)
lookups.appendlist(
url_pattern.callback,
@@ -585,6 +604,7 @@ class URLResolver:
namespaces[namespace] = (p_pattern + prefix, sub_pattern)
for app_name, namespace_list in url_pattern.app_dict.items():
apps.setdefault(app_name, []).extend(namespace_list)
+ self._callback_strs.update(url_pattern._callback_strs)
self._namespace_dict[language_code] = namespaces
self._app_dict[language_code] = apps
self._reverse_dict[language_code] = lookups
@@ -629,6 +649,11 @@ class URLResolver:
route2 = route2[1:]
return route1 + route2
+ def _is_callback(self, name):
+ if not self._populated:
+ self._populate()
+ return name in self._callback_strs
+
def resolve(self, path):
path = str(path) # path may be a reverse_lazy object
tried = []