Heroku 不会在 Django 上收集静态数据,但告诉它确实如此

Posted

技术标签:

【中文标题】Heroku 不会在 Django 上收集静态数据,但告诉它确实如此【英文标题】:Heroku doesn't collect static on Django but tell that it does 【发布时间】:2020-11-24 01:26:42 【问题描述】:

命令heroku run python manage.py collectstatic 给我返回类似的东西

163 static files copied to '/app/live-static-files/static-root', 
509 post-processed.

这是我的设置:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', # White Noise
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
]
STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, "live-static-files", "static-root")

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

MEDIA_URL = "/media/"

MEDIA_ROOT = os.path.join(BASE_DIR, "live-static-files", "media-root")

DISABLE_COLLECTSTATIC = 0

通过heroku run bash 我转到/app/live-static-files/static-root 并看到它是空的(该文件夹存在,因为它在带有.gitkeep 的repo 中)并且服务器对所有请求都给出500 错误。

现在使用heroku run bash 我尝试python manage.py collectstatic 并且它有效!但是在heroku restart 之后又是空的。

为什么 Heroku 告诉它复制了 statics,甚至告诉了 statics 文件夹的正确路径但实际上并没有这样做?为什么它实际上没有这样做?

【问题讨论】:

你不能通过heroku run运行collectstatic。此类命令在一次性测功机中运行,一旦命令结束就会被丢弃。确保将其作为构建过程的一部分运行 (this is the default) 或将静态资产存储在共享位置,例如在 Amazon S3 或 Azure Blob 存储上。 @Chris 我在配置中有DISABLE_COLLECTSTATIC = 0,无论如何它不起作用,部署后静态文件夹为空 这不属于您的设置文件,它是一个 Heroku config var。用heroku config:unset DISABLE_COLLECTSTATIC清除它。 @Chris 是的,我知道 【参考方案1】:

Heroku 文件系统是短暂的 - 这意味着在 dyno 运行时对文件系统的任何更改只会持续到该 dyno 关闭或重新启动。每个测功机都使用最新部署的文件系统的干净副本启动。这类似于有多少基于容器的系统(例如 Docker)在运行。

此外,在正常操作下,dynos 每天都会在一个称为“循环”的过程中重新启动。

阅读这些文章:

https://help.heroku.com/K1PPS2WM/why-are-my-file-uploads-missing-deleted

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

【讨论】:

是的,我知道,但无论如何,DISABLE_COLLECTSTATIC = 0 Heroku 应该每次都将静态复制到STATIC_ROOT,但现在每次我重新启动它或进行新部署时,STATIC_ROOT 都是空的 您的存储库是否包含 STATIC_ROOT 目录? 啊,你用的是WhiteNoise,对吧?您是否也将这些行添加到 wsgi.py 文件中? from whitenoise.django import DjangoWhiteNoiseapplication = DjangoWhiteNoise(application) DjangoWhiteNoise 看起来现在已弃用

以上是关于Heroku 不会在 Django 上收集静态数据,但告诉它确实如此的主要内容,如果未能解决你的问题,请参考以下文章

找不到静态文件 - 在 Heroku 上部署 Django

由于静态文件收集原因,Heroku 拒绝推送

Django heroku 静态目录

在 Heroku 服务器上部署 Django 错误 (500) - 据说是静态文件问题

在 Heroku 上部署 Django/静态文件的正确方法

由于静态错误,无法在 Heroku 上部署 Django [重复]