django项目的生产设置

时间:2013-01-22 06:17:31

标签: python django heroku production

我创建了一个production_settings.py,其中我将所有生成的env变量和值放在其中,例如:

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

我以为我会声明一个像

这样的env变量

MYPROJECT_PRODUCTION

并将其设置为

heroku config:add MYPROJECT_PRODUCTION=Trueexport 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

3 个答案:

答案 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