summaryrefslogtreecommitdiff
path: root/django/contrib
diff options
context:
space:
mode:
authorJake Howard <RealOrangeOne@users.noreply.github.com>2024-05-29 14:48:27 +0100
committerGitHub <noreply@github.com>2024-05-29 10:48:27 -0300
commitff308a06047cd60806d604a7cf612e5656ee2ac9 (patch)
treef2139fbf020cbdf33bad64a3377700623c18a44f /django/contrib
parent02dab94c7b8585c7ae3854465574d768e1df75d3 (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.py4
-rw-r--r--django/contrib/admin/templatetags/admin_urls.py10
-rw-r--r--django/contrib/auth/decorators.py6
-rw-r--r--django/contrib/auth/middleware.py6
-rw-r--r--django/contrib/auth/mixins.py6
-rw-r--r--django/contrib/auth/views.py10
-rw-r--r--django/contrib/staticfiles/handlers.py4
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):