2

我创建了一个production_settings.py在其中放置所有生产环境变量和值的方法,例如:

import dj_database_url
DATABASES['default'] =  dj_database_url.config()

我以为我会声明一个环境变量,例如

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

4

3 回答 3

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,但我认为这没什么大不了的。

于 2013-01-22T07:56:06.517 回答
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 上的任何设置,heroku config:set并消除处理多个设置文件的复杂性,例如:

heroku config:set MEDIA_URL=http://custom-media-server.com/media/
heroku config:set STATIC_URL=http://custom-media-server.com/static/

我还创建了一个自定义Django 项目模板,它可以从环境变量中获取大多数设置。

您还应该查看12 Factor Application网站,特别是如何存储配置

于 2013-01-22T17:13:58.437 回答
0

您是否将 DATABASES 定义为字典?经过:

DATABASES = {}

也展示你的 heroku logs

于 2013-01-22T13:42:51.420 回答