diff options
| author | Jake Howard <RealOrangeOne@users.noreply.github.com> | 2024-05-29 14:48:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-29 10:48:27 -0300 |
| commit | ff308a06047cd60806d604a7cf612e5656ee2ac9 (patch) | |
| tree | f2139fbf020cbdf33bad64a3377700623c18a44f /django/contrib | |
| parent | 02dab94c7b8585c7ae3854465574d768e1df75d3 (diff) | |
Fixed 35467 -- Replaced urlparse with urlsplit where appropriate.
This work should not generate any change of functionality, and
`urlsplit` is approximately 6x faster.
Most use cases of `urlparse` didn't touch the path, so they can be
converted to `urlsplit` without any issue. Most of those which do use
`.path`, simply parse the URL, mutate the querystring, then put them
back together, which is also fine (so long as urlunsplit is used).
Diffstat (limited to 'django/contrib')
| -rw-r--r-- | django/contrib/admin/options.py | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/admin_urls.py | 10 | ||||
| -rw-r--r-- | django/contrib/auth/decorators.py | 6 | ||||
| -rw-r--r-- | django/contrib/auth/middleware.py | 6 | ||||
| -rw-r--r-- | django/contrib/auth/mixins.py | 6 | ||||
| -rw-r--r-- | django/contrib/auth/views.py | 10 | ||||
| -rw-r--r-- | django/contrib/staticfiles/handlers.py | 4 |
7 files changed, 23 insertions, 23 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 12467de74d..9cc891d807 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -6,7 +6,7 @@ import warnings from functools import partial, update_wrapper from urllib.parse import parse_qsl from urllib.parse import quote as urlquote -from urllib.parse import urlparse +from urllib.parse import urlsplit from django import forms from django.conf import settings @@ -1384,7 +1384,7 @@ class ModelAdmin(BaseModelAdmin): ) def _get_preserved_qsl(self, request, preserved_filters): - query_string = urlparse(request.build_absolute_uri()).query + query_string = urlsplit(request.build_absolute_uri()).query return parse_qsl(query_string.replace(preserved_filters, "")) def response_add(self, request, obj, post_url_continue=None): diff --git a/django/contrib/admin/templatetags/admin_urls.py b/django/contrib/admin/templatetags/admin_urls.py index 871b0d5f20..176e7a49ed 100644 --- a/django/contrib/admin/templatetags/admin_urls.py +++ b/django/contrib/admin/templatetags/admin_urls.py @@ -1,4 +1,4 @@ -from urllib.parse import parse_qsl, unquote, urlparse, urlunparse +from urllib.parse import parse_qsl, unquote, urlsplit, urlunsplit from django import template from django.contrib.admin.utils import quote @@ -24,8 +24,8 @@ def add_preserved_filters(context, url, popup=False, to_field=None): preserved_filters = context.get("preserved_filters") preserved_qsl = context.get("preserved_qsl") - parsed_url = list(urlparse(url)) - parsed_qs = dict(parse_qsl(parsed_url[4])) + parsed_url = list(urlsplit(url)) + parsed_qs = dict(parse_qsl(parsed_url[3])) merged_qs = {} if preserved_qsl: @@ -66,5 +66,5 @@ def add_preserved_filters(context, url, popup=False, to_field=None): merged_qs.update(parsed_qs) - parsed_url[4] = urlencode(merged_qs) - return urlunparse(parsed_url) + parsed_url[3] = urlencode(merged_qs) + return urlunsplit(parsed_url) diff --git a/django/contrib/auth/decorators.py b/django/contrib/auth/decorators.py index ea1cef0795..78e76a9ae9 100644 --- a/django/contrib/auth/decorators.py +++ b/django/contrib/auth/decorators.py @@ -1,6 +1,6 @@ import asyncio from functools import wraps -from urllib.parse import urlparse +from urllib.parse import urlsplit from asgiref.sync import async_to_sync, sync_to_async @@ -25,8 +25,8 @@ def user_passes_test( resolved_login_url = resolve_url(login_url or settings.LOGIN_URL) # If the login url is the same scheme and net location then just # use the path as the "next" url. - login_scheme, login_netloc = urlparse(resolved_login_url)[:2] - current_scheme, current_netloc = urlparse(path)[:2] + login_scheme, login_netloc = urlsplit(resolved_login_url)[:2] + current_scheme, current_netloc = urlsplit(path)[:2] if (not login_scheme or login_scheme == current_scheme) and ( not login_netloc or login_netloc == current_netloc ): diff --git a/django/contrib/auth/middleware.py b/django/contrib/auth/middleware.py index 761929d67d..cb409ee778 100644 --- a/django/contrib/auth/middleware.py +++ b/django/contrib/auth/middleware.py @@ -1,5 +1,5 @@ from functools import partial -from urllib.parse import urlparse +from urllib.parse import urlsplit from django.conf import settings from django.contrib import auth @@ -74,8 +74,8 @@ class LoginRequiredMiddleware(MiddlewareMixin): resolved_login_url = resolve_url(self.get_login_url(view_func)) # If the login url is the same scheme and net location then use the # path as the "next" url. - login_scheme, login_netloc = urlparse(resolved_login_url)[:2] - current_scheme, current_netloc = urlparse(path)[:2] + login_scheme, login_netloc = urlsplit(resolved_login_url)[:2] + current_scheme, current_netloc = urlsplit(path)[:2] if (not login_scheme or login_scheme == current_scheme) and ( not login_netloc or login_netloc == current_netloc ): diff --git a/django/contrib/auth/mixins.py b/django/contrib/auth/mixins.py index 0e46000d97..1f2e95ff00 100644 --- a/django/contrib/auth/mixins.py +++ b/django/contrib/auth/mixins.py @@ -1,4 +1,4 @@ -from urllib.parse import urlparse +from urllib.parse import urlsplit from django.conf import settings from django.contrib.auth import REDIRECT_FIELD_NAME @@ -51,8 +51,8 @@ class AccessMixin: resolved_login_url = resolve_url(self.get_login_url()) # If the login url is the same scheme and net location then use the # path as the "next" url. - login_scheme, login_netloc = urlparse(resolved_login_url)[:2] - current_scheme, current_netloc = urlparse(path)[:2] + login_scheme, login_netloc = urlsplit(resolved_login_url)[:2] + current_scheme, current_netloc = urlsplit(path)[:2] if (not login_scheme or login_scheme == current_scheme) and ( not login_netloc or login_netloc == current_netloc ): diff --git a/django/contrib/auth/views.py b/django/contrib/auth/views.py index 9a6d18bcd2..a18cfdb347 100644 --- a/django/contrib/auth/views.py +++ b/django/contrib/auth/views.py @@ -1,4 +1,4 @@ -from urllib.parse import urlparse, urlunparse +from urllib.parse import urlsplit, urlunsplit from django.conf import settings @@ -183,13 +183,13 @@ def redirect_to_login(next, login_url=None, redirect_field_name=REDIRECT_FIELD_N """ resolved_url = resolve_url(login_url or settings.LOGIN_URL) - login_url_parts = list(urlparse(resolved_url)) + login_url_parts = list(urlsplit(resolved_url)) if redirect_field_name: - querystring = QueryDict(login_url_parts[4], mutable=True) + querystring = QueryDict(login_url_parts[3], mutable=True) querystring[redirect_field_name] = next - login_url_parts[4] = querystring.urlencode(safe="/") + login_url_parts[3] = querystring.urlencode(safe="/") - return HttpResponseRedirect(urlunparse(login_url_parts)) + return HttpResponseRedirect(urlunsplit(login_url_parts)) # Class-based password reset views diff --git a/django/contrib/staticfiles/handlers.py b/django/contrib/staticfiles/handlers.py index 7394eff818..686718a355 100644 --- a/django/contrib/staticfiles/handlers.py +++ b/django/contrib/staticfiles/handlers.py @@ -36,13 +36,13 @@ class StaticFilesHandlerMixin: * the host is provided as part of the base_url * the request's path isn't under the media path (or equal) """ - return path.startswith(self.base_url[2]) and not self.base_url[1] + return path.startswith(self.base_url.path) and not self.base_url.netloc def file_path(self, url): """ Return the relative path to the media file on disk for the given URL. """ - relative_url = url.removeprefix(self.base_url[2]) + relative_url = url.removeprefix(self.base_url.path) return url2pathname(relative_url) def serve(self, request): |
