我在cloudControl上部署了一个Django应用程序。配置是标准配置,推/部署没有(明显)错误。在
但是collectstatic step没有被执行:它无声地失败(我没有看到-----> Collecting static files
消息)。部署之后,应用程序的静态文件夹为空,因此您会不断地收到500个服务器错误。在
我可以通过改变Procfile
来解决它,但它也不一致:
web: python manage.py collectstatic --noinput; gunicorn app.wsgi:application --config gunicorn_cnf.py --bind 0.0.0.0:${PORT:-5000}`
collectstatic在本地正常工作,如果我运行cctrlapp app/deployment run "python manage.py collectstatic --noinput"
,也不会显示任何错误:
669 static files copied to '/srv/www/staticfiles/static', 669 post-processed.
但是/srv/www/staticfiles/static
是空的。在
我怎么知道为什么在推送阶段没有执行collectstatic?在
我已经能够使用custom python buildpack来调试这个问题,所以这里是答案以供进一步参考。在
问题出在
settings.py
文件中。在这个文件中,我要做的第一件事是检查我们是在cloudControl环境中还是在本地环境中。我这样做是为了寻找CRED_FILE
环境变量(与what is suggested没有太大区别):如果没有找到变量,我将加载一个本地JSON文件,该文件模拟用于开发的credentials变量:一旦我了解了环境,我可以使用不同的
INSTALLED_APPS
(requirements.txt
文件在生产和开发中也略有不同)或更改一些设置。在现在坏消息是:在推送阶段,没有可用的
CRED_FILE
。所以我试图加载未安装的应用程序(因为它们只在开发需求文件中,比如}),或者使用未设置的凭据(
coverage
或{creds.json
当然没有上传到存储库:只有带有伪值的TXT作为引用上载)。这就是为什么collectstatic
在推送阶段默默失败的原因。在以下是我的解决方案(只要您的回购中有一个伪凭证文件,它就可以工作):
^{pr2}$凭据不被
collectstatic
使用,因此您可以在creds.json.txt
文件中拥有任何内容。不是很干净,但它现在起作用了。在编辑
正如@pst在注释中指出的,有一个环境变量可以知道buildpack是否正在运行,因此我们也可以使用该变量来加载所需的凭据并设置
DEBUG
。在相关问题 更多 >
编程相关推荐