首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cloudControl部署中调试Django‘`collectstatic`’的问题

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

Stack Overflow用户
提问于 2015-03-31 13:13:32
回答 1查看 271关注 0票数 1

我在cloudControl上部署了一个Django应用程序。配置是标准的,推送/部署是在没有明显错误的情况下进行的。

但是集束步骤没有被执行:它无声地失败了(我没有看到-----> Collecting static files消息)。部署之后,应用程序的静态文件夹为空,因此您将不断获得500Server错误。

我可以通过修改Procfile**来解决这个问题,但是它也不一致:**

代码语言:javascript
复制
web: python manage.py collectstatic --noinput; gunicorn app.wsgi:application --config gunicorn_cnf.py --bind 0.0.0.0:${PORT:-5000}`

集合静态在本地工作,如果我运行cctrlapp app/deployment run "python manage.py collectstatic --noinput",也不会显示任何错误:

669个静态文件复制到‘/srv/www/staticfiles/静态’,669个后处理.

但是/srv/www/staticfiles/static是空的。

我如何知道为什么在推送阶段没有执行收集器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-03 09:48:56

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

问题在settings.py文件中。我在这个文件中做的第一件事是检查我们是在cloudControl环境中还是在本地环境中。我查找CRED_FILE环境变量(与有什么建议没有太大的不同):如果没有找到变量,则加载一个本地JSON文件,该文件模拟用于开发的凭据变量:

代码语言:javascript
复制
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在推送阶段默默失败的原因。

以下是我的解决方案(只要您在回购中有一个虚拟凭据文件,它就能工作):

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29369576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档