从Heroku的Django的collectstatic推至S3每次(Django collects

2019-08-07 11:03发布

我使用Django的储存与S3(和S3BotoStorage)静态文件。 当我做collectstatic从我的本地机器上,如所期望的行为,只有修改过的文件推到S3。 这个过程需要Python-dateutils 1.5检查修改的时间。

但是,这样做在Heroku结果中的每个文件相同的,而无论推,虽然设置是一样的。 然后我看着在Heroku自身文件的修改时间,好像中,os.stat(static_filename).st_mtime是一样的,最后推的时间。

这是预期的行为? 是否Heroku的文件复制周围,即使没有从git的变化?

Answer 1:

尝试设置DISABLE_COLLECTSTATIC=1为环境设置为您的应用程序-应从每推运行禁用它。

请参阅本文的详细信息- https://devcenter.heroku.com/articles/django-assets :

> Sometimes, you may not want Heroku to run collectstatic on your behalf.
> You can disable collectstatic by enabling user-env-compile as well:

$ heroku labs:enable user-env-compile
$ heroku config:set DISABLE_COLLECTSTATIC=1

我发现,简单地设置的配置会做-没有必要也使user-env-compile -这可能是因为,这已经从实验室到生产过去了?

- NB部署由Heroku的蟒蛇buildpack,你可以在这里看到管理https://github.com/heroku/heroku-buildpack-python/

编辑1

我刚刚做了一堆关于这个测试,可以证实, DISABLE_COLLECTSTATIC确实不禁止collectstatic,而不管的user-env-compile环境-我认为这是目前在主干(但这是猜测)。 似乎并不关心设置是什么-如果DISABLE_COLLECTSTATIC存在,因为它使用的配置变种。



Answer 2:

我强烈建议您使用collectfast包任何Django的静态部署到S3,无论是本地或从您的Heroku服务器。 它忽略修改的日期,并利用MD5哈希值,其中S3 API将提供非常快,(可选)缓存,使你的静态部署变焦。 它把我的静态部署,从大约10-15分钟<2分钟,仅部署,实际上已更改的文件。



Answer 3:

我刚刚把相同的问题,并联系Heroku的支持,找出到底是怎么回事。 我给他们的问题是:

我碰到一个时髦的问题做了一些部署。 看来,每个推修改的所有文件的日期更新为新的部署/混帐推发生的时间。 这是预期的行为?

当考虑到Django的collectstatic命令仅会检查评估,如果该文件应在整个为静态资产的最终存储后端被复制时,文件的修改日期,这意味着,每一个新的推动,所有文件都首先从远程存储删除(在这种情况下S3),然后重新上载。 这是由消耗带宽方面和要求都非常缓慢和浪费的过程。

我今天收到了来自“财长”,Heroku的支持的一个工作人员,得到的答案是

嗨,这是它目前是如何工作的,是的。 我路由您的反馈给我们的运行团队,看看我们是否能与原来的日期打包文件。



Answer 4:

正如证实阿伦,Heroku的改变,当它部署文件的修改日期。 然而,亚马逊S3还拥有被称为ETAG的属性,它是文件内容的MD5哈希值。 这有可能以此来检查文件是否已经改变,而不是修改的日期,在实现这一Django的片段 。

我把这些代码,打包,并修正了一些错误,我发现,并把它作为Github上Django的S3-collectstatic 。 它包括一个新的管理命令fasts3collectstatic只上传新文件。 检查Github上页的安装说明。



Answer 5:

为什么不从本机上运行collectstatic?

python manage.py collectstatic --noinput --settings=settings.[prod]


Answer 6:

我同意这是annoying-有几件事情可以做。 我重写collectstatic命令,并在我的生产设置连线起来。 下面是我用的命令:

```

from django.core.management.base import BaseCommand
class Command(BaseCommand):
    args = '< none >'
    help = "disables collectstatic cmd in contrib"
    def handle(self, *args, **kwargs):
        print 'collectstatic disabled'

```

然后,我在生产中设置记住这mysite的/ disablecollectstatic /管理/命令:

INSTALLED_APPS += ('mysite.disablecollectstatic',)

另外,您可以使用Heroku的首先进行试运行实际调用命令之前的事实。 如果失败,它不会运行它,这意味着你可以图谋一个错误(也许通过删除您的设置静态的根目录,例如),但这种做法让我很紧张:

https://devcenter.heroku.com/articles/django-assets#detection



文章来源: Django collectstatic from Heroku pushes to S3 everytime