django压缩器未在Heroku上设置绝对CSS图像路径
我正在使用连接和压缩我的CSS和JS文件。我正在从S3存储桶中提供静态文件 在我本地的站点副本上,使用不同的S3存储桶,这一切都非常有效。但是在Heroku上托管的live站点上,除了CSS文件中图像的相对URL没有被重新写入外,其他都可以正常工作 例如,CSS文件中的这一行:django压缩器未在Heroku上设置绝对CSS图像路径,django,amazon-s3,django-compressor,Django,Amazon S3,Django Compressor,我正在使用连接和压缩我的CSS和JS文件。我正在从S3存储桶中提供静态文件 在我本地的站点副本上,使用不同的S3存储桶,这一切都非常有效。但是在Heroku上托管的live站点上,除了CSS文件中图像的相对URL没有被重新写入外,其他都可以正常工作 例如,CSS文件中的这一行: background-image: url("../img/glyphicons-halflings-grey.png"); 被重写为: background-image:url('https://my-dev-buc
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')
在我的开发网站上,但在现场网站上没有涉及。因此,live站点最终会在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文件被最小化了,很好。。。但这就像另一个过滤器没有被应用到实时站点上一样。我已经有一个月的时间遇到了完全相同的问题,但这在1.3版本(3/18/13,所以您可能在1.2)中得到了修复,所以只需升级:
pip install -U django-compressor
我放弃了解决这个问题,但它与Heroku和CssAbsoluteFilter被调用有关,但是at_converter方法失败。查看1.3变更日志,唯一相关的提交是:
我放弃了,生命太短暂。我最近在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,绝对URL现在都适用于我
问题
该问题与“compressor.filters.css_default.CssAbsoluteFilter”有关,与您的调试设置有关,还与heroku具有只读文件系统并在每次部署时覆盖您的应用程序文件有关
compress在开发服务器上正常工作的原因是,当DEBUG=True时,CssAbsoluteFilter将始终找到静态文件,即使您从未运行过“collectstatic”。它在静态文件中查找它们
当生产服务器上的DEBUG=False时,CssAbsoluteFilter假定静态文件已收集到COMPRESS\u根目录中,如果找不到文件,则不会应用绝对过滤器
Jerdez,django压缩机的作者:
如果已成功提供要使用的文件,CssAbsoluteFilter将使用DEBUG=False。在开发过程中,压缩器使用StaticFilesFinder作为一种方便,因此您不必一直运行collectstatic
现在是heroku。即使将静态文件存储在S3上,也需要将它们存储在heroku()上。由于heroku是一个只读文件系统,因此唯一的方法是让heroku在部署期间自动收集静态文件(请参阅)
根据我的经验,手动或甚至在Procfile中运行“heroku run python manage.py collectstatic--noinput”会将文件上载到S3,但不会将文件保存到静态根目录(默认情况下压缩程序将其用作压缩根目录)。您可以使用“heroku运行ls path/to/collected”确认您的静态文件已在heroku上收集
如果您的文件已在heroku上成功收集,您也应该能够成功压缩您的文件,而无需使用我上面提供的解决方案。
但是,如果自上次部署以来您对静态文件进行了更改,heroku似乎只会收集静态文件。如果没有对静态文件进行任何更改,您将看到类似“复制250个静态文件中的0个”的内容。这是一个问题,因为heroku在您部署时完全替换了您的应用程序内容,所以您会丢失以前在COMPRESS\u ROOT/static\u ROOT中收集的所有静态文件。如果在heroku上不再存在收集的文件且DEBUG=False后尝试压缩文件,CSSABSolutionFilter将不会用绝对URL替换相对URL
我上面的解决方案完全避免了heroku问题,并用绝对URL替换相对css URL,即使在DEBUG=False时也是如此
希望其他人也会发现这些信息很有帮助。与此同时,django compressor 1.6中已经解决了这一问题。从:
i、 e.即使DEBUG=True,绝对过滤器也会运行。FWIW,我放弃了这个。无法解决该问题,随后在S3上生成的CSS和JS文件压缩程序返回403个禁止的错误。人生苦短,有意思,谢谢元马!那么您是否尝试过1.3,它为您解决了问题?我看不出这个特定的commit将如何解决问题,但我可能是错的,或者可能有其他东西可以完成这项工作。升级到1.3对我来说不起作用。查看我的解决方案:我希望我在3天前找到它。:)我将collectstatic和compress调用放在bin/post\u compile和heroku config:set DISABLE\u collectstatic=0中。这也解释了为什么在我第一次部署时它就工作了,但之后每次都失败了。感谢您的详细解释。对于那些使用sass的人,这个和
压缩预编译器与('text/x-scss','django\u libsass.SassCompiler')
解决了我的问题
Apply CssAbsoluteFilter to precompiled css even when compression is disabled