Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django压缩器未在Heroku上设置绝对CSS图像路径_Django_Amazon S3_Django Compressor - Fatal编程技术网

django压缩器未在Heroku上设置绝对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

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

在我本地的站点副本上,使用不同的S3存储桶,这一切都非常有效。但是在Heroku上托管的live站点上,除了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')
在我的开发网站上,但在现场网站上没有涉及。因此,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