【问题标题】:Django-Compressor throws UncompressableFileErrorDjango-Compressor 抛出 UncompressableFileError
【发布时间】:2011-12-06 23:40:06
【问题描述】:

我正在使用 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。 (大)也许它是由其他地方的未处理异常触发的。
  • 这里完全一样的问题,你找到解决办法了吗?
  • 不,从未找到解决方案。最终使用了 django-mediagenerator,我不是它的忠实粉丝,但它确实有效。

标签: django django-staticfiles django-compressor


【解决方案1】:

我遇到了同样的问题。

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

【讨论】:

    【解决方案2】:

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

    我认为压缩器会检查 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 }}。页面加载正常,没有压缩器标签。
    【解决方案3】:

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

    在我的例子中,这是一个非常简单的例子:我硬编码了我的静态 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" />
    

    希望这对任何人都有帮助。

    【讨论】:

      【解决方案4】:

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

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

      [1] 我也在运行一些非标准的代码来显示静态页面,也许这会干扰以及这个错误不太常见的原因。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2017-04-11
          • 2017-07-29
          • 1970-01-01
          • 2016-05-26
          • 2012-02-12
          • 2013-02-09
          • 2015-04-05
          • 1970-01-01
          • 2014-09-27
          相关资源
          最近更新 更多