Django-Compressor 报错 UncompressableFileError

24
我正在使用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,并且该文件实际上可以通过该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')

这个问题对我来说似乎有点棘手。我正在使用gunicorn上的Django 1.3。(很大可能)也许是由其他未处理的异常触发的。 - Bob Jansen
这里有完全相同的问题,你找到解决方案了吗? - Gert Steyn
没有,我从来没有找到解决方案。最终使用了django-mediagenerator,虽然我不是很喜欢它,但它确实起作用了。 - Chris Lawlor
5个回答

7

1
这是一个老问题,但在搜索此错误消息时仍然是少数几个搜索结果之一,因此分享我的解决方案可能很有价值。
在我的情况下,问题非常简单:我硬编码了静态URL并忘记了开头的“/”。所以我有这样的代码:
<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" />

希望这能帮到任何人。

1

看起来好像你的上下文中没有 STATIC_URL。你已经配置了 staticfiles contextprocessor,对吗?你尝试过不使用压缩器标签来链接文件吗?当你加载页面时,{{STATIC_URL}}是否正确显示在页面中?

我认为即使通过文件系统访问它,compressor也会检查URL,看一下https://github.com/jezdez/django_compressor/blob/develop/compressor/base.py#L57


是的,你描述了问题。看一下我的错误日志中的最后一行(这是通过在你提到的函数中添加一个打印语句创建的)。你会发现url是/css/facebox.css,但base_url是/static/。url不正确,因为它没有以base_url开头,所以会抛出异常。然而,错误日志还显示该文件被处理两次,并且{{STATIC_URL}}第一次正确添加。如果没有压缩器标签,页面可以正常加载。 - Chris Lawlor

0
我遇到了同样的问题;在我的情况下,问题是由于使用COMPRESS_OFFLINE_CONTEXT引起的 - 它不会.update()上下文,而是完全替换它,从而删除STATIC_URL。 在我的情况下,解决方案只是将其添加回COMPRESS_OFFLINE_CONTEXT中,在本地设置导入之后,否则任何覆盖都不会起作用。

0

我进一步查看了它,很确定异常是由于尝试在第一个传递没有完整上下文的情况下显示未捕获错误页面所造成的。这会导致 Django 压缩器中的异常。[1]

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

[1] 我还运行了一些非标准代码来显示静态页面,也许这会干扰,并且这个 bug 不太常见的原因就在这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接