From 7aad3d3fa8a8db8eb8ea9e64134d60b2400029f0 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Tue, 1 Feb 2011 14:57:10 +0000 Subject: [PATCH] Fixed #15094 - Added check for forgetting trailing comma in STATICFILES_DIRS tuple. Also reorganized staticfiles settings-checks for better consistency. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15386 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/staticfiles/finders.py | 8 +++++++ django/contrib/staticfiles/handlers.py | 7 +----- django/contrib/staticfiles/storage.py | 5 ++--- django/contrib/staticfiles/utils.py | 15 +++++-------- .../staticfiles_tests/tests.py | 22 +++++++++++++++++-- 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/django/contrib/staticfiles/finders.py b/django/contrib/staticfiles/finders.py index 8d66cfe7243..c3b0eb6f07f 100644 --- a/django/contrib/staticfiles/finders.py +++ b/django/contrib/staticfiles/finders.py @@ -46,11 +46,19 @@ class FileSystemFinder(BaseFinder): self.storages = SortedDict() # Set of locations with static files self.locations = set() + if not isinstance(settings.STATICFILES_DIRS, (list, tuple)): + raise ImproperlyConfigured( + "Your STATICFILES_DIRS setting is not a tuple or list; " + "perhaps you forgot a trailing comma?") for root in settings.STATICFILES_DIRS: if isinstance(root, (list, tuple)): prefix, root = root else: prefix = '' + if os.path.abspath(settings.STATIC_ROOT) == os.path.abspath(root): + raise ImproperlyConfigured( + "The STATICFILES_DIRS setting should " + "not contain the STATIC_ROOT setting") self.locations.add((prefix, root)) # Don't initialize multiple storages for the same location for prefix, root in self.locations: diff --git a/django/contrib/staticfiles/handlers.py b/django/contrib/staticfiles/handlers.py index ace19f4f096..669ffaeabc1 100644 --- a/django/contrib/staticfiles/handlers.py +++ b/django/contrib/staticfiles/handlers.py @@ -26,12 +26,7 @@ class StaticFilesHandler(WSGIHandler): return settings.STATIC_ROOT def get_base_url(self): - if not settings.STATIC_URL: - raise ImproperlyConfigured("You're using the staticfiles app " - "without having set the STATIC_URL setting. Set it to " - "URL that handles the files served from STATIC_ROOT.") - if settings.DEBUG: - utils.check_settings() + utils.check_settings() return settings.STATIC_URL def _should_handle(self, path): diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py index d93b7e052a9..ab4a364f9bf 100644 --- a/django/contrib/staticfiles/storage.py +++ b/django/contrib/staticfiles/storage.py @@ -10,7 +10,7 @@ from django.contrib.staticfiles import utils class StaticFilesStorage(FileSystemStorage): """ Standard file system storage for static files. - + The defaults for ``location`` and ``base_url`` are ``STATIC_ROOT`` and ``STATIC_URL``. """ @@ -28,8 +28,7 @@ class StaticFilesStorage(FileSystemStorage): raise ImproperlyConfigured("You're using the staticfiles app " "without having set the STATIC_URL setting. Set it to " "URL that handles the files served from STATIC_ROOT.") - if settings.DEBUG: - utils.check_settings() + utils.check_settings() super(StaticFilesStorage, self).__init__(location, base_url, *args, **kwargs) diff --git a/django/contrib/staticfiles/utils.py b/django/contrib/staticfiles/utils.py index 217bc7a7067..9ff4bc4321b 100644 --- a/django/contrib/staticfiles/utils.py +++ b/django/contrib/staticfiles/utils.py @@ -35,9 +35,13 @@ def get_files(storage, ignore_patterns=[], location=''): def check_settings(): """ - Checks if the MEDIA_(ROOT|URL) and STATIC_(ROOT|URL) - settings have the same value. + Checks if the staticfiles settings have sane values. + """ + if not settings.STATIC_URL: + raise ImproperlyConfigured( + "You're using the staticfiles app " + "without having set the required STATIC_URL setting.") if settings.MEDIA_URL == settings.STATIC_URL: raise ImproperlyConfigured("The MEDIA_URL and STATIC_URL " "settings must have different values") @@ -45,10 +49,3 @@ def check_settings(): (settings.MEDIA_ROOT == settings.STATIC_ROOT)): raise ImproperlyConfigured("The MEDIA_ROOT and STATIC_ROOT " "settings must have different values") - for path in settings.STATICFILES_DIRS: - # in case the item contains a prefix - if isinstance(path, (list, tuple)): - path = path[1] - if os.path.abspath(settings.STATIC_ROOT) == os.path.abspath(path): - raise ImproperlyConfigured("The STATICFILES_DIRS setting should " - "not contain the STATIC_ROOT setting") diff --git a/tests/regressiontests/staticfiles_tests/tests.py b/tests/regressiontests/staticfiles_tests/tests.py index ea1f6d2954c..1fb043c715f 100644 --- a/tests/regressiontests/staticfiles_tests/tests.py +++ b/tests/regressiontests/staticfiles_tests/tests.py @@ -10,8 +10,6 @@ from django.contrib.staticfiles import finders, storage from django.core.exceptions import ImproperlyConfigured from django.core.files.storage import default_storage from django.core.management import call_command -from django.db.models.loading import load_app -from django.template import Template, Context from django.test import TestCase from django.utils._os import rmtree_errorhandler @@ -383,7 +381,27 @@ class TestMiscFinder(TestCase): self.assertTrue(isinstance(finders.get_finder( 'django.contrib.staticfiles.finders.FileSystemFinder'), finders.FileSystemFinder)) + + def test_get_finder_bad_classname(self): self.assertRaises(ImproperlyConfigured, finders.get_finder, 'django.contrib.staticfiles.finders.FooBarFinder') + + def test_get_finder_bad_module(self): self.assertRaises(ImproperlyConfigured, finders.get_finder, 'foo.bar.FooBarFinder') + + +class TestStaticfilesDirsType(TestCase): + """ + We can't determine if STATICFILES_DIRS is set correctly just by looking at + the type, but we can determine if it's definitely wrong. + """ + def setUp(self): + self.old_settings_dir = settings.STATICFILES_DIRS + settings.STATICFILES_DIRS = 'a string' + + def tearDown(self): + settings.STATICFILES_DIRS = self.old_settings_dir + + def test_non_tuple_raises_exception(self): + self.assertRaises(ImproperlyConfigured, finders.FileSystemFinder)