我在cloudControl上部署了一个Django应用程序。配置是标准的,推送/部署是在没有明显错误的情况下进行的。
但是集束步骤没有被执行:它无声地失败了(我没有看到-----> Collecting static files消息)。部署之后,应用程序的静态文件夹为空,因此您将不断获得500Server错误。
我可以通过修改Procfile**,来解决这个问题,但是它也不一致:**
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是空的。
我如何知道为什么在推送阶段没有执行收集器?
发布于 2015-04-03 09:48:56
我已经能够使用自定义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 .
因此,我试图加载没有安装的应用程序(因为它们只在开发需求文件中,如coverage或django-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 = Falsecollectstatic不使用凭据,因此可以在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 = Truehttps://stackoverflow.com/questions/29369576
复制相似问题