diff --git a/django/core/files/storage.py b/django/core/files/storage.py index b5348948fe..c3ad1faadf 100644 --- a/django/core/files/storage.py +++ b/django/core/files/storage.py @@ -254,8 +254,6 @@ class FileSystemStorage(Storage): def __init__(self, location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None): self._location = location - if base_url is not None and not base_url.endswith('/'): - base_url += '/' self._base_url = base_url self._file_permissions_mode = file_permissions_mode self._directory_permissions_mode = directory_permissions_mode @@ -286,6 +284,8 @@ class FileSystemStorage(Storage): @cached_property def base_url(self): + if self._base_url is not None and not self._base_url.endswith('/'): + self._base_url += '/' return self._value_or_setting(self._base_url, settings.MEDIA_URL) @cached_property diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py index dcd27de5c7..d419d82bd0 100644 --- a/tests/file_storage/tests.py +++ b/tests/file_storage/tests.py @@ -24,6 +24,7 @@ from django.test import ( override_settings, ) from django.test.utils import requires_tz_support +from django.urls import NoReverseMatch, reverse_lazy from django.utils import six, timezone from django.utils._os import upath from django.utils.deprecation import RemovedInDjango20Warning @@ -73,7 +74,7 @@ class GetStorageClassTests(SimpleTestCase): get_storage_class('django.core.files.non_existing_storage.NonExistingStorage') -class FileStorageDeconstructionTests(unittest.TestCase): +class FileSystemStorageTests(unittest.TestCase): def test_deconstruction(self): path, args, kwargs = temp_storage.deconstruct() @@ -89,6 +90,14 @@ class FileStorageDeconstructionTests(unittest.TestCase): path, args, kwargs = storage.deconstruct() self.assertEqual(kwargs, kwargs_orig) + def test_lazy_base_url_init(self): + """ + FileSystemStorage.__init__() shouldn't evaluate base_url. + """ + storage = FileSystemStorage(base_url=reverse_lazy('app:url')) + with self.assertRaises(NoReverseMatch): + storage.url(storage.base_url) + # Tests for TZ-aware time methods need pytz. requires_pytz = unittest.skipIf(pytz is None, "this test requires pytz")