diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-09-01 21:09:16 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-01 21:09:16 +0200 |
| commit | 974942a75039ba43e618f6a5ff95e08b5d5176fd (patch) | |
| tree | 954db3b65546eb13320cc57e814a1b5fa887bf05 /django/urls | |
| parent | e64919ae54933ef4840f0e27e51d9fcfd55ecf4b (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.py | 25 |
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 = [] |
