Я создал 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

2
damon 22 Янв 2013 в 10:17

3 ответа

Лучший ответ

Лично я сохраняю свои производственные настройки в 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',
    }
}

У меня сложилось впечатление, что это довольно хорошо используемый метод (я узнал об этом от коллег, но я тоже видел его в блоге)

РЕДАКТИРОВАТЬ

В ответ на очень хорошие замечания балаза вы можете включить вариант этого метода, чтобы сохранить конфиденциальность конфиденциальных данных. Возможно, добавьте следующее после импорта local_settings -

try:
    from production_settings import *
except ImportError, e:
    pass

Затем исключите production_settings.py из контроля версий. Думаю, вам может понадобиться использовать другой метод для развертывания production_settings.py, но я не думаю, что это слишком большое дело.

1
Aidan Ewen 22 Янв 2013 в 08:55

Вы определили базы данных как словарь? по:

DATABASES = {}

Также покажите свой heroku logs

0
Delremm 22 Янв 2013 в 13:42

Я не советую использовать разные файлы настроек для разных сред, чтобы настроить ваши переменные среды. Это позволяет по умолчанию использовать ваши локальные настройки разработки и переопределять их в производственной среде.

Например база данных и статические / медиа корневые настройки

# 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 и, в частности, узнать, как настройка хранилища.

1
Alen Mujezinovic 22 Янв 2013 в 17:13