Управление несколькими файлами settings.py

Возможный дубликат:
Как управлять настройками локального или производственного процесса в Django?

Мне удалось успешно выполнить проект Django на веб-сервере Apache с mod_wsgi.

Мне бы хотелось получить рекомендации по управлению несколькими settings.py файлами. Сейчас у меня есть одна для разработки и одна совершенно другая для производства (относительно параметров БД, локализации статического контента и тому подобного). Мой файл settings.py имеет версию (не знаю, является ли это хорошей практикой), и я развертываю его с чем-то вроде:

$ hg archive myproject.tbz2
$ cd /path/of/apache/web/project/location
$ bzip2 -db /home/myself/myproject/myproject.tbz2 | tar -xvf -

Работает нормально. Но я обнаружил, что манипулирую несколькими файлами settings.py.

Я думаю, мой вопрос: какие лучшие практики при развертывании проектов DJANGO в отношении нескольких версий файлов settings.py?

Ответы

Ответ 1

Я использую модуль настроек, который не является одним файлом:

settings/
    __init__.py
    _base.py
    _servers.py
    development.py
    production.py
    testing.py

Файл __init__.py прост:

from _servers import get_server_type
exec("from %s import *" % get_server_type())

Файл _base.py содержит все общие настройки для всех типов серверов.

В файле _servers.py содержится функция get_server_type(), которая использует socket.gethostname() для определения того, какой тип сервера является текущей машиной: он возвращает development, production или testing.

Затем другие файлы немного похожи (production.py):

DEBUG=False
TEMPLATE_DEBUG=False
from _base import *

В каждом из этих файлов я устанавливаю параметры, которые применяются только к этому типу сервера.

Ответ 2

Трюк, который кажется наиболее распространенным, заключается в том, чтобы поддерживать файл settings.py и local_settings.py(один для каждой среды).

Агностические параметры среды перейдите в settings.py и внизу файла, вы будете импортировать из local_settings.py

try:
    from local_settings import *
except ImportError:
    pass

Вы можете переопределить любые параметры settings.py в соответствующем файле local_settings.py

Ответ 3

django-admin.py/manage.py оба принимают параметр --settings=mysite.settings. В разработке вы можете явно указать --settings=dev_settings. Вы также можете установить переменную среды DJANGO_SETTINGS_MODUL E в настройке apache.

Лично я просто не проверяю settings.py. Вместо этого я проверяю несколько файлов настроек (dev_settings, prod_settings и т.д.) И символически свяжу их с параметрами settings.py. Таким образом, если я просто проверю свое приложение, он не будет запущен, пока я не подумаю о том, какой файл настроек подходит и фактически помещает этот файл настроек на место.

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

Ответ 4

Мой предпочтительный способ - загрузить отдельный файл ini с помощью ConfigParser, основанный на одиночной настройке или переменной окружения. В любом случае в django wiki существует много разных опций: http://code.djangoproject.com/wiki/SplitSettings