在云控制部署程序中调试Django“collectstatic”时出现问题

2024-05-29 07:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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?在


Tags: pyapp应用程序manage部署www错误static
1条回答
网友
1楼 · 发布于 2024-05-29 07:22:49

我已经能够使用custom python buildpack来调试这个问题,所以这里是答案以供进一步参考。在

问题出在settings.py文件中。在这个文件中,我要做的第一件事是检查我们是在cloudControl环境中还是在本地环境中。我这样做是为了寻找CRED_FILE环境变量(与what is suggested没有太大区别):如果没有找到变量,我将加载一个本地JSON文件,该文件模拟用于开发的credentials变量:

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

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

一旦我了解了环境,我可以使用不同的INSTALLED_APPSrequirements.txt文件在生产和开发中也略有不同)或更改一些设置。在

现在坏消息是:在推送阶段,没有可用的CRED_FILE

所以我试图加载未安装的应用程序(因为它们只在开发需求文件中,比如coverage或{}),或者使用未设置的凭据(creds.json当然没有上传到存储库:只有带有伪值的TXT作为引用上载)。这就是为什么collectstatic在推送阶段默默失败的原因。在

以下是我的解决方案(只要您的回购中有一个伪凭证文件,它就可以工作):

^{pr2}$

凭据不被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

相关问题 更多 >

    热门问题