Django-Compressor抛出UncompressableFileError

时间:2011-10-13 13:38:12

标签: django django-staticfiles django-compressor

我正在使用django-compressor和django-staticfiles(外部版本,我在Django 1.2上)。

当我尝试加载我的网站时,出现错误:

TemplateSyntaxError: Caught UncompressableFileError while rendering: 'css/facebox.css' isn't accesible via COMPRESS_URL ('/static/') and can't be compressed

我已验证COMPRESS_URL等于STATIC_URL,并且该文件实际上可以通过该网址访问。

查看django-compressor代码,我发现抛出异常的地方:

 def get_basename(self, url):
        try:
            base_url = self.storage.base_url
        except AttributeError:
            base_url = settings.COMPRESS_URL
        # I added the following print statement:
        print "url: %s, base_url: %s" % (url, base_url)
        if not url.startswith(base_url):
            raise UncompressableFileError("'%s' isn't accesible via "
                                          "COMPRESS_URL ('%s') and can't be "
                                          "compressed" % (url, base_url))

模板中的第一个{% compress css %}块是:

{% compress css %}
<link rel="stylesheet" href="/static/css/blueprint/screen.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/facebox.css" />
{% endcompress %}

(请注意,第一个链接不使用{{ STATIC_URL }},但第二个链接不使用

我在错误日志中得到了这个:

[Thu Oct 13 08:19:13 2011] [error] url: /static/css/blueprint/screen.css, base_url: /static/
[Thu Oct 13 08:19:13 2011] [error] url: /static/css/facebox.css, base_url: /static/
[Thu Oct 13 08:19:14 2011] [error] url: /static/css/blueprint/screen.css, base_url: /static/
[Thu Oct 13 08:19:14 2011] [error] url: css/facebox.css, base_url: /static/

如您所见,screen.css文件处理两次,第二次成功处理。但是,facebox.css文件第二次失败,因为在第二次解析文件时模板上下文中没有定义{{ STATIC_URL }},因此可以推测它。

显然我可以通过不使用{{ STATIC_URL }}来解决问题,但这不是一个可接受的解决方案。

为什么我的css文件会被处理两次?他们最初有media='screen, projection',但我认为它导致了这个问题。

相关设置:

In [4]: from compressor.conf import settings

In [5]: settings.COMPRESS_ROOT
Out[5]: '/home/ianchat/static_files'

In [6]: settings.STATIC_ROOT
Out[6]: '/home/ianchat/static_files'

In [7]: settings.COMPRESS_URL
Out[7]: '/static/'

In [8]: settings.STATIC_URL
Out[8]: '/static/'

In [9]: settings.COMPRESS_OUTPUT_DIR
Out[9]: 'CACHE'

In [10]: settings.COMPRESS_CSS_FILTERS
Out[10]: ['compressor.filters.csstidy.CSSTidyFilter']

In [11]: settings.STATICFILES_FINDERS
Out[11]: 
('staticfiles.finders.FileSystemFinder',
 'staticfiles.finders.AppDirectoriesFinder',
 'staticfiles.finders.LegacyAppDirectoriesFinder',
 'compressor.finders.CompressorFinder')

6 个答案:

答案 0 :(得分:6)

我碰到了同样的问题。

答案在这里找到:https://github.com/jezdez/django_compressor/pull/206 链接的解决方案是处理handler500。 我决定更改500.html模板,以避免其中包含任何{{STATIC_URL}},问题就解决了。

答案 1 :(得分:1)

几乎看起来STATIC_URL不在您的上下文中。你确实配置了staticfiles上下文处理器,对吗?您是否尝试过不使用压缩器标签的文件?加载时,{{STATIC_URL}}是否在页面中正确显示?

我认为压缩器会检查网址,即使它通过查看https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57的文件系统访问它

答案 2 :(得分:1)

这是一个老问题,但是在搜索此错误消息时为数不多的搜索结果之一,因此分享我的解决方案可能值得一些。

在我的情况下,这是一个死的简单案例:我硬编码了我的静态网址,并在开始时忘记了/。所以我有这个:

<link type="text/css" rel="stylesheet" href="static/style.css" />

哪个给了我错误。更改为:

<link type="text/css" rel="stylesheet" href="/static/style.css" />

它被修复了。当然,我后来意识到,我应该使用设置STATIC_URL:

<link type="text/css" rel="stylesheet" href="{{ STATIC_URL }}style.css" />

希望这有助于任何人。

答案 3 :(得分:0)

我已经看了一些,我很确定异常是由于尝试显示未捕获的错误页面而没有第一遍的完整上下文引起的。这导致django-compressor中的异常。[1]

当然,解决方案是处理所有错误。

[1]我也在运行一些非标准的代码来显示静态页面,这可能会干扰这个错误的原因。

答案 4 :(得分:0)

我遇到了同样的问题;在我的情况下,问题是由使用COMPRESS_OFFLINE_CONTEXT引起的 - 它不是.update()上下文,但它完全取代了它,因此删除了STATIC_URL。 在我的情况下,解决方案只是在 local_settings导入后将其添加回COMPRESS_OFFLINE_CONTEXT,否则任何覆盖都不会有效。

答案 5 :(得分:-2)

似乎您的settings.COMPRESS_URL需要从系统中获取静态,而不是来自网址本身。

尝试将您的设置更改为COMPRESS_URL值:

# in case your static is on same level than settings.py (usually are)
COMPRESS_URL = r'%s/static' % os.path.abspath(os.path.dirname(__file__))

请使用新信息或我的回答评论更新您的错误日志。