繁体   English   中英

在cloudControl部署中调试Django`collectstatic`的问题

[英]Problems debugging Django `collectstatic` in a cloudControl deployment

我有一个部署到cloudControl的Django应用程序。 配置是标准配置,推送/部署不会发生(明显)错误。

但是collectstatic步骤没有执行:它静默失败(我看不到-----> 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为空。


我怎么知道为什么在push阶段没有执行collectstatic?

我已经能够使用自定义的python buildpack调试问题,所以这里是进一步参考的答案。

问题出在settings.py文件中。 我在此文件中要做的第一件事是检查我们是在cloudControl环境中还是在本地环境中。 我这样做是在寻找CRED_FILE环境变量(与建议的变量没有太大不同):如果未找到任何变量,则会加载一个本地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

因此,我试图加载未安装的应用程序(因为它们仅在开发需求文件中,例如coveragedjango-debug-toolbar )或使用未设置的凭据(当然, creds.json未上传到资源库:仅上传具有虚拟值的TXT作为参考)。 这就是为什么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使用的,因此creds.json.txt文件中可以包含任何内容。 不是很干净,但是现在可以正常工作了。


编辑

正如@pst在评论中指出的那样,有一个环境变量可以知道buildpack是否正在运行,因此我们也可以使用该变量来加载所需的凭据并设置DEBUG

if 'CRED_FILE' in os.environ:
    cred_file = os.environ['CRED_FILE']
    DEBUG = False

elif 'BUILDPACK_RUNNING' in os.environ:
    cred_file = os.path.join(BASE_DIR, 'creds.json.txt') 
    DEBUG = False

else:
    cred_file = os.path.join(BASE_DIR, 'creds.json')
    DEBUG = True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM