我创建了一个production_settings.py
,其中我将所有生成的env变量和值放在其中,例如:
import dj_database_url
DATABASES['default'] = dj_database_url.config()
我以为我会声明一个像
这样的env变量MYPROJECT_PRODUCTION
并将其设置为
heroku config:add MYPROJECT_PRODUCTION=True
或export MYPROJECT_PRODUCTION=True
在settings.py(由django创建的默认设置)中,我以为我会在文件的末尾添加
import os
if os.environ.has_key('MYPROJECT_PRODUCTION') and os.environ.get('MYPROJECT_PRODUCTION')=='True':
from production_settings import *
这是正确的做法吗?
我在尝试python manage shell
export DJANGO_SETTINGS_MODULE='myproject.settings'
export MYPROJECT_PRODUCTION=True
me@ubuntu:~/dev/python/django/myproject$ python manage.py shell
Error: Can't find the file 'settings.py' in the directory containing 'manage.py'. It appears you've customized things.
You'll have to run django-admin.py, passing it your settings module.
(If the file settings.py does indeed exist, it's causing an ImportError somehow.)
manage.py与settings.py存在于同一文件夹中。但仍然会发生错误。
我查看了输出echo $MYPROJECT_PRODUCTION
True
答案 0 :(得分:1)
就个人而言,我将生产设置保留在settings.py
中,然后包含local_settings.py
文件(使用.hgignore排除在修订控制之外)。
我将以下内容添加到settings.py
的末尾try:
from local_settings import *
except ImportError, e:
pass
然后在我的local_settings.py中覆盖相应的设置 -
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'tag',
'USER': 'tag',
'PASSWORD': 'tag',
'HOST': 'localhost',
'PORT': '5432',
}
}
我的印象是这是一种使用得相当好的方法(我从同事那里得到了它,但我也看过它的博客)
修改
对于balazs非常好的回应,您可能会在此方法中包含一个变体,以便将敏感数据保密。可能在local_settings
导入 -
try:
from production_settings import *
except ImportError, e:
pass
然后从版本控制中排除production_settings.py
。我想你可能需要使用不同的方法来部署production_settings.py
,但我不认为这是一个太大的交易。
答案 1 :(得分:1)
我建议不要在不同环境中使用不同的设置文件,以支持使用环境变量自定义设置。这允许您默认使用本地开发设置并在生产中覆盖它。
例如数据库和静态/媒体根设置
# Default database URL is a local SQLite instance
DATABASE_URL = 'sqlite:///%s' % os.path.join(os.path.dirname(__file__), 'db.sqlite')
DATABASES = {
'default': dj_database_url.config('DATABASE_URL', default=DATABASE_URL),
}
MEDIA_ROOT = os.environ.get('MEDIA_ROOT',
os.path.join(os.path.dirname(__file__), 'media'))
MEDIA_URL = os.environ.get('MEDIA_URL', '/media/')
STATIC_ROOT = os.environ.get('STATIC_ROOT',
os.path.join(os.path.dirname(__file__), 'static'))
STATIC_URL = os.environ.get('STATIC_URL', '/static/')
这允许您通过heroku config:set
在Heroku上设置任何设置,并消除处理多个设置文件的复杂性,例如:
heroku config:set MEDIA_URL=http://custom-media-server.com/media/
heroku config:set STATIC_URL=http://custom-media-server.com/static/
我还创建了一个自定义Django project template,可以从环境变量中获取大多数设置。
您还应该查看12 Factor Application网站,特别是如何store configuration。
答案 2 :(得分:0)
您是否已将DATABASES定义为字典?由:
DATABASES = {}
还会显示您的heroku logs