Kaydet (Commit) eb5df8e9 authored tarafından Jannis Leidel's avatar Jannis Leidel

Fixed the relative static file resolution of the CachedStaticFilesStorage…

Fixed the relative static file resolution of the CachedStaticFilesStorage backend and the post processing of deeply nested static files.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16862 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst 75199e8f
...@@ -113,13 +113,22 @@ class CachedFilesMixin(object): ...@@ -113,13 +113,22 @@ class CachedFilesMixin(object):
return matched return matched
name_parts = name.split('/') name_parts = name.split('/')
# Using posix normpath here to remove duplicates # Using posix normpath here to remove duplicates
result = url_parts = posixpath.normpath(url).split('/') url = posixpath.normpath(url)
level = url.count('..') url_parts = url.split('/')
if level: parent_level, sub_level = url.count('..'), url.count('/')
result = name_parts[:-level - 1] + url_parts[level:] if url.startswith('/'):
elif name_parts[:-1]: sub_level -= 1
result = name_parts[:-1] + url_parts[-1:] url_parts = url_parts[1:]
joined_result = '/'.join(result) if parent_level or not url.startswith('/'):
start, end = parent_level + 1, parent_level
else:
if sub_level:
if sub_level == 1:
parent_level -= 1
start, end = parent_level, sub_level - 1
else:
start, end = 1, sub_level - 1
joined_result = '/'.join(name_parts[:-start] + url_parts[end:])
hashed_url = self.url(joined_result, force=True) hashed_url = self.url(joined_result, force=True)
# Return the hashed and normalized version to the file # Return the hashed and normalized version to the file
return 'url("%s")' % hashed_url return 'url("%s")' % hashed_url
......
body {
background: #d3d6d8 url("img/window.png");
}
\ No newline at end of file
@import url("../cached/styles.css"); @import url("../cached/styles.css");
@import url("absolute.css"); @import url("absolute.css");
\ No newline at end of file body {
background: #d3d6d8 url(img/relative.png);
}
\ No newline at end of file
@import url("cached/other.css"); @import url("other.css");
\ No newline at end of file \ No newline at end of file
...@@ -300,11 +300,11 @@ class TestCollectionCachedStorage(BaseCollectionTestCase, ...@@ -300,11 +300,11 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
""", "/static/test/file.dad0999e4f8f.txt") """, "/static/test/file.dad0999e4f8f.txt")
self.assertTemplateRenders(""" self.assertTemplateRenders("""
{% load static from staticfiles %}{% static "cached/styles.css" %} {% load static from staticfiles %}{% static "cached/styles.css" %}
""", "/static/cached/styles.5653c259030b.css") """, "/static/cached/styles.93b1147e8552.css")
def test_template_tag_simple_content(self): def test_template_tag_simple_content(self):
relpath = self.cached_file_path("cached/styles.css") relpath = self.cached_file_path("cached/styles.css")
self.assertEqual(relpath, "cached/styles.5653c259030b.css") self.assertEqual(relpath, "cached/styles.93b1147e8552.css")
with storage.staticfiles_storage.open(relpath) as relfile: with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read() content = relfile.read()
self.assertFalse("cached/other.css" in content, content) self.assertFalse("cached/other.css" in content, content)
...@@ -316,7 +316,7 @@ class TestCollectionCachedStorage(BaseCollectionTestCase, ...@@ -316,7 +316,7 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
with storage.staticfiles_storage.open(relpath) as relfile: with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read() content = relfile.read()
self.assertFalse("/static/cached/styles.css" in content) self.assertFalse("/static/cached/styles.css" in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content) self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
def test_template_tag_denorm(self): def test_template_tag_denorm(self):
relpath = self.cached_file_path("cached/denorm.css") relpath = self.cached_file_path("cached/denorm.css")
...@@ -324,16 +324,26 @@ class TestCollectionCachedStorage(BaseCollectionTestCase, ...@@ -324,16 +324,26 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
with storage.staticfiles_storage.open(relpath) as relfile: with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read() content = relfile.read()
self.assertFalse("..//cached///styles.css" in content) self.assertFalse("..//cached///styles.css" in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content) self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
def test_template_tag_relative(self): def test_template_tag_relative(self):
relpath = self.cached_file_path("cached/relative.css") relpath = self.cached_file_path("cached/relative.css")
self.assertEqual(relpath, "cached/relative.298ff891a8d4.css") self.assertEqual(relpath, "cached/relative.8dffb45d91f5.css")
with storage.staticfiles_storage.open(relpath) as relfile: with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read() content = relfile.read()
self.assertFalse("../cached/styles.css" in content) self.assertFalse("../cached/styles.css" in content)
self.assertFalse('@import "styles.css"' in content) self.assertFalse('@import "styles.css"' in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content) self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
self.assertFalse("url(img/relative.png)" in content)
self.assertTrue("/static/cached/img/relative.acae32e4532b.png" in content)
def test_template_tag_deep_relative(self):
relpath = self.cached_file_path("cached/css/window.css")
self.assertEqual(relpath, "cached/css/window.9db38d5169f3.css")
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse('url(img/window.png)' in content)
self.assertTrue('url("/static/cached/css/img/window.acae32e4532b.png")' in content)
def test_template_tag_url(self): def test_template_tag_url(self):
relpath = self.cached_file_path("cached/url.css") relpath = self.cached_file_path("cached/url.css")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment