Fixed #17861 -- Took care of special characters when creating the staticfiles storage cache keys. Many thanks to Preston Holmes.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17688 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2012-03-12 20:28:09 +00:00
parent ebc6fc9354
commit 3a5f9cd1ae
2 changed files with 17 additions and 1 deletions

View File

@ -95,7 +95,7 @@ class CachedFilesMixin(object):
return urlunsplit(unparsed_name) return urlunsplit(unparsed_name)
def cache_key(self, name): def cache_key(self, name):
return u'staticfiles:cache:%s' % name return u'staticfiles:%s' % hashlib.md5(smart_str(name)).hexdigest()
def url(self, name, force=False): def url(self, name, force=False):
""" """

View File

@ -7,10 +7,12 @@ import posixpath
import shutil import shutil
import sys import sys
import tempfile import tempfile
import warnings
from StringIO import StringIO from StringIO import StringIO
from django.template import loader, Context from django.template import loader, Context
from django.conf import settings from django.conf import settings
from django.core.cache.backends.base import BaseCache, CacheKeyWarning
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.core.management import call_command from django.core.management import call_command
@ -498,6 +500,20 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
self.assertTrue(os.path.join('cached', 'css', 'window.css') in stats['post_processed']) self.assertTrue(os.path.join('cached', 'css', 'window.css') in stats['post_processed'])
self.assertTrue(os.path.join('cached', 'css', 'img', 'window.png') in stats['unmodified']) self.assertTrue(os.path.join('cached', 'css', 'img', 'window.png') in stats['unmodified'])
def test_cache_key_memcache_validation(self):
"""
Handle cache key creation correctly, see #17861.
"""
name = "/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/" + chr(22) + chr(180)
cache_key = storage.staticfiles_storage.cache_key(name)
self.save_warnings_state()
cache_validator = BaseCache({})
warnings.filterwarnings('error', category=CacheKeyWarning)
cache_validator.validate_key(cache_key)
self.restore_warnings_state()
self.assertEqual(cache_key, 'staticfiles:e95bbc36387084582df2a70750d7b351')
# we set DEBUG to False here since the template tag wouldn't work otherwise # we set DEBUG to False here since the template tag wouldn't work otherwise
TestCollectionCachedStorage = override_settings(**dict(TEST_SETTINGS, TestCollectionCachedStorage = override_settings(**dict(TEST_SETTINGS,
STATICFILES_STORAGE='django.contrib.staticfiles.storage.CachedStaticFilesStorage', STATICFILES_STORAGE='django.contrib.staticfiles.storage.CachedStaticFilesStorage',