From e13b71403bd1568abed237858127677144d43d23 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 31 Dec 2020 13:18:57 +0100 Subject: [PATCH] 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. --- django/conf/__init__.py | 13 +++---------- docs/releases/3.1.5.txt | 6 ++++++ tests/settings_tests/tests.py | 4 +++- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/django/conf/__init__.py b/django/conf/__init__.py index 23fee7d5b7c..28302440c7c 100644 --- a/django/conf/__init__.py +++ b/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) diff --git a/docs/releases/3.1.5.txt b/docs/releases/3.1.5.txt index eea060d1122..82dc1f02548 100644 --- a/docs/releases/3.1.5.txt +++ b/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`). diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py index 1368b2ae180..f9f8bdb5ab2 100644 --- a/tests/settings_tests/tests.py +++ b/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'):