压缩器未在Heroku上设置绝对CSS图像路径

我正在使用django-compressor在本站上连接和压缩我的CSS和JS文件。 我正在从S3存储桶中提供静态文件。

在我的本地网站上,使用不同的S3存储桶,这一切都很完美。 但是,在Heroku上托管的实时网站上,除CSS文件中图像的相对URL不会被重写外,它们都可以正常工作。

例如,CSS文件中的这一行:

background-image: url("../img/glyphicons-halflings-grey.png");

被重写为:

background-image:url('https://my-dev-bucket-name.s3.amazonaws.com/static/img/glyphicons-halflings-grey.png')

在我的开发网站上,但在现场没有触及。 因此,活动网站最终会在pepysdiary.s3.amazonaws.com/static/CACHE/img/查找图像(因为它与新的压缩CSS文件相关)。

现在,我在该位置放置了一个包含图像的目录,但我无法弄清楚为什么会有这种差异。 这两个网站都有这个设置:

COMPRESS_CSS_FILTERS = [
    # Creates absolute urls from relative ones.
    'compressor.filters.css_default.CssAbsoluteFilter',
    # CSS minimizer.
    'compressor.filters.cssmin.CSSMinFilter'
]

而CSS文件正在被最小化......但它就像另一个过滤器没有被应用在现场。


我最近在heroku上遇到了这个问题,运行最新版本的django-compressor(1.3)并不能解决问题。 我将提供我正在使用的解决方案,并解释我遇到的问题。

解决方案

我创建了我自己的'CssAbsoluteFilter',它从'find'方法中删除settings.DEBUG检查,如下所示:

# compress_filters.py
from compressor.filters.css_default import CssAbsoluteFilter
from compressor.utils import staticfiles


class CustomCssAbsoluteFilter(CssAbsoluteFilter):
    def find(self, basename):
        # The line below is the original line.  I removed settings.DEBUG.
        # if settings.DEBUG and basename and staticfiles.finders:
        if basename and staticfiles.finders:
            return staticfiles.finders.find(basename)

# settings.py
COMPRESS_CSS_FILTERS = [
# 'compressor.filters.css_default.CssAbsoluteFilter',
'app.compress_filters.CustomCssAbsoluteFilter',
'compressor.filters.cssmin.CSSMinFilter',
]

无论DEBUG = True还是False,绝对网址现在都适用于我。

问题

该问题与'compressor.filters.css_default.CssAbsoluteFilter',您的DEBUG设置以及heroku具有只读文件系统并在您每次部署时覆盖应用程序文件的事实相关。

压缩在您的开发服务器上正常工作的原因是,即使您从不运行'collectstatic',CssAbsoluteFilter也会在DEBUG = True时始终找到您的静态文件。 它在STATICFILES_DIRS中查找它们。

当您的生产服务器上的DEBUG = False时,CssAbsoluteFilter会假定静态文件已被收集到您的COMPRESS_ROOT中,并且如果无法找到这些文件,则不会应用绝对过滤器。

django-compressor的作者Jerdez如此解释:

如果您已成功提供要使用的文件,则CssAbsoluteFilter可与DEBUG = False一起使用。 在开发过程中,压缩机使用静态文件查找器作为一种便利,所以您不必一直运行collectstatic。

现在为heroku。 即使您将静态文件存储在S3上,也需要将它们存储在heroku上(使用CachedS3BotoStorage)。 由于heroku是只读文件系统,因此唯一的方法是让heroku在部署过程中自动收集静态文件(请参阅https://devcenter.heroku.com/articles/django-assets)。

根据我的经验,手动运行'heroku运行python manage.py collectstatic --noinput'或者甚至在你的Procfile中将文件上传到S3,但它不会将文件保存到你的STATIC_ROOT目录中(默认情况下,压缩器使用COMPRESS_ROOT )。 您可以使用'heroku run ls path / to / collected'确认您的静态文件已经在heroku上收集。

如果您的文件已成功收集到heroku上,则应该能够成功压缩文件,而无需使用上面提供的解决方案。

但是,如果自上次部署以来,您已经对静态文件进行了更改,Heroku似乎只会收集静态文件。 如果没有对静态文件进行更改,则会看到类似“复制了250个静态文件中的0个”的内容。 这是一个问题,因为在部署时,heroku会完全替换您的应用内容,因此您将失去先前在COMPRESS_ROOT / STATIC_ROOT中收集的任何静态文件。 如果在收集的文件不再存在于heroku和DEBUG = False之后尝试压缩文件,则CssAbsoluteFilter不会用绝对URL来替换相关的URL。

我上面的解决方案完全避免了heroku问题,即使在DEBUG = False时也会用绝对路径替换相关的css url。

希望其他人也会发现这些信息很有帮助。


我在一个月内遇到了同样的问题,但是在1.3版本(2013年3月18日发布,因此您可能在1.2版本)中修复了这个问题,所以只需升级:

pip install -U django-compressor

我放弃了解决这个问题的确切问题,但是它涉及Heroku和CssAbsoluteFilter被调用,但是在_converter方法失败。 查看1.3更新日志,唯一相关的提交是这样的:https://github.com/jezdez/django_compressor/commit/8254f8d707f517ab154ad0d6d77dfc1ac292bf41

我放弃了,生命太短暂了。


同时这已经在django-compressor 1.6中得到了修复。 从更新日志:

Apply CssAbsoluteFilter to precompiled css even when compression is disabled

即使DEBUG = True,绝对过滤器也会运行。

链接地址: http://www.djcxy.com/p/71089.html

上一篇: compressor not setting absolute CSS image paths on Heroku

下一篇: compressor still output a file when memcached is used?