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 DjangoWhiteNoise
application = DjangoWhiteNoise(application)
DjangoWhiteNoise 看起来现在已弃用以上是关于Heroku 不会在 Django 上收集静态数据,但告诉它确实如此的主要内容,如果未能解决你的问题,请参考以下文章