Quellcode durchsuchen

Fixed #32304 -- Fixed prefixing STATIC_URL and MEDIA_URL by SCRIPT_NAME for absolute URLs with no domain.

Thanks Adam Hooper for the report.

Regression in c574bec0929cd2527268c96a492d25223a9fd576.
Mariusz Felisiak vor 4 Jahren
Ursprung
Commit
e13b71403b
3 geänderte Dateien mit 12 neuen und 11 gelöschten Zeilen
  1. 3 10
      django/conf/__init__.py
  2. 6 0
      docs/releases/3.1.5.txt
  3. 3 1
      tests/settings_tests/tests.py

+ 3 - 10
django/conf/__init__.py

@@ -15,8 +15,7 @@ from pathlib import Path
 
 import django
 from django.conf import global_settings
-from django.core.exceptions import ImproperlyConfigured, ValidationError
-from django.core.validators import URLValidator
+from django.core.exceptions import ImproperlyConfigured
 from django.utils.deprecation import RemovedInDjango40Warning
 from django.utils.functional import LazyObject, empty
 
@@ -132,14 +131,8 @@ class LazySettings(LazyObject):
         Useful when the app is being served at a subpath and manually prefixing
         subpath to STATIC_URL and MEDIA_URL in settings is inconvenient.
         """
-        # Don't apply prefix to valid URLs.
-        try:
-            URLValidator()(value)
-            return value
-        except (ValidationError, AttributeError):
-            pass
-        # Don't apply prefix to absolute paths.
-        if value.startswith('/'):
+        # Don't apply prefix to absolute paths and URLs.
+        if value.startswith(('http://', 'https://', '/')):
             return value
         from django.urls import get_script_prefix
         return '%s%s' % (get_script_prefix(), value)

+ 6 - 0
docs/releases/3.1.5.txt

@@ -16,3 +16,9 @@ Bugfixes
 * Fixed a bug in Django 3.1 that caused a crash when processing middlewares in
   an async context with a middleware that raises a ``MiddlewareNotUsed``
   exception (:ticket:`32299`).
+
+* Fixed a regression in Django 3.1 that caused the incorrect prefixing of
+  ``STATIC_URL`` and ``MEDIA_URL`` settings, by the server-provided value of
+  ``SCRIPT_NAME`` (or ``/`` if not set), when set to a URL specifying the
+  protocol but without a top-level domain, e.g. ``http://myhost/``
+  (:ticket:`32304`).

+ 3 - 1
tests/settings_tests/tests.py

@@ -573,10 +573,12 @@ class MediaURLStaticURLPrefixTest(SimpleTestCase):
             set_script_prefix(val)
 
     def test_not_prefixed(self):
-        # Don't add SCRIPT_NAME prefix to valid URLs, absolute paths or None.
+        # Don't add SCRIPT_NAME prefix to absolute paths, URLs, or None.
         tests = (
             '/path/',
             'http://myhost.com/path/',
+            'http://myhost/path/',
+            'https://myhost/path/',
             None,
         )
         for setting in ('MEDIA_URL', 'STATIC_URL'):