我有一个部署到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个静态文件复制到'/ srv / www / staticfiles / static',669后处理。
但是/srv/www/staticfiles/static
是空的。
我怎么知道为什么在推动阶段没有执行collectstatic?
答案 0 :(得分:2)
我已经能够使用custom python buildpack来调试问题了,所以这里有答案供进一步参考。
问题出在settings.py
文件中。我在这个文件中做的第一件事是检查我们是在云控制环境中还是在本地环境中。我这样做是为了寻找CRED_FILE
环境变量(what is suggested没有那么不同):如果没有找到变量,我加载一个模仿该凭证变量的本地JSON文件进行开发:
try:
cred_file = os.environ['CRED_FILE']
DEBUG = False
except KeyError:
cred_file = os.path.join(BASE_DIR, 'creds.json')
DEBUG = True
一旦我了解了环境,我就可以让不同的INSTALLED_APPS
(requirements.txt
文件在生产和开发方面略有不同)或更改一些设置。
现在是坏消息:在推动阶段,没有CRED_FILE
可用。
所以我试图加载未安装的应用程序(因为它们只在开发要求文件中,如coverage
或django-debug-toolbar
)或使用未设置的凭据({{1}当然,没有上传到存储库:仅上传具有虚拟值的TXT作为参考)。这就是creds.json
在推动阶段默默失败的原因。
这是我的解决方案(只要您的回购中有虚拟凭证文件,它就会起作用):
collectstatic
try:
cred_file = os.environ['CRED_FILE']
DEBUG = False
except KeyError:
if os.path.exists(os.path.join(BASE_DIR, 'creds.json')):
cred_file = os.path.join(BASE_DIR, 'creds.json')
DEBUG = True
else:
cred_file = os.path.join(BASE_DIR, 'creds.json.txt')
DEBUG = False
未使用凭据,因此您可以在collectstatic
文件中包含任何内容。不是很干净,但它现在按预期工作。
修改强>
正如@pst在评论中指出的那样,有一个环境变量可以知道buildpack是否正在运行,所以我们也可以使用它来加载所需的凭据并设置creds.json.txt
。
DEBUG