Heroku Dyno 上的 Django 静态文件

Posted

技术标签:

【中文标题】Heroku Dyno 上的 Django 静态文件【英文标题】:Django Static Files on Heroku Dyno 【发布时间】:2021-06-03 14:56:31 【问题描述】:

我在 Heroku 上运行一个 django 应用程序,目前使用 AWS S3 来提供我的静态文件。我们将静态文件存储在每个应用程序的静态文件夹中,以及目录根目录的 static/ 文件夹中。根目录下的static/ 文件夹大小约为 40Mb。

每当我们将应用程序部署到 Heroku 时,静态文件都会包含在 Heroku slug 中,因此 heroku run python manage.py collectstatic --no-input 可以从 Dyno 本身运行,然后将任何更改/新的静态文件复制到我们的 S3 存储桶,以便它们可以被提供。

问题是,在我们完成这个过程之后,我们现在在 Dyno 上有一个 static/ 文件夹,它占用了大约 40Mb 的空间,而且看起来毫无用处,因为我们的文件是从我们的 S3 存储桶提供的!

有没有更好的方法来部署我们的应用程序,并将我们的静态文件收集到我们的 S3 存储桶,但将静态文件复制到 Heroku?

我想的一种方法是将所有静态文件添加到 Heroku 的 .slugignore 文件中,然后配置一种方法将静态文件上传到我们的 S3 存储桶,而根本不使用 Heroku。不过,我不确定这是否是正确的做法,希望能就此提出建议。

我们一直在研究这个问题的原因是我们的 Heroku slug 大小开始变得太大(~450Mb),我们需要开始减少它。

【问题讨论】:

【参考方案1】:

在进一步挖掘之后,我发现有人在做我上面描述的事情的例子,即直接将静态文件上传到 S3,而不使用任何中间存储。 This article 展示了如何配置 Django 和 S3,以便在本地机器上运行 python manage.py collectstatic 会将静态文件直接复制到 S3。

这个配置,结合在 Heroku (https://devcenter.heroku.com/articles/django-assets#disabling-collectstatic) 上禁用 collectstatic 并将我们的静态文件添加到 .slugignore,将正是我想要的,即直接将静态文件上传到 S3 而无需先上传它们到 Heroku。

更多阅读来自Django' docs

【讨论】:

以上是关于Heroku Dyno 上的 Django 静态文件的主要内容,如果未能解决你的问题,请参考以下文章

python 在Heroku上关闭django的中间件。见http://stackoverflow.com/questions/30969597/how-do-i-handle-dyno-restar

Heroku 上的 Django - 损坏的管理静态文件

在 Heroku 上托管一个静态网站需要多少台测功机?

Heroku 上的 Django 静态文件

在根级别使用namecheap域配置heroku hobby dyno

Heroku 上的 Django - 缺少静态文件 manifest.json 文件