Поскольку тема постоянно обновляется, позвольте мне резюмировать, почему вы, возможно, захотите рассмотреть этот подход:
тупой файл настроек очень быстр и легко изменяется;особенно в производственной среде.Не требуется Python: любой идиот может подключиться и изменить пароль базы данных в файле, который просто перечисляет имена и значения;особенно по сравнению со сложным файлом настроек Python, содержащим загадочные и опасные имена BIGCAPS.
приложение settings
должно быть полностью отделено от приложения code
.Вы можете поместить config.ini за пределы корня репозитория и больше никогда не беспокоиться о том, что выталкивание репо нарушает ваши настройки, или ваши личные настройки загрязняют репо, или этот умный код в вашем settings.py не превращает его в репозиторий в интересах всех остальных..
Это не относится к небольшим проектам, но для более крупных проектов я пришел к выводу, что стратегия local_settings просто не сокращает ее;со временем достаточно прикладного программирования, которое становится трудным для обработки;прежде всего, когда настройки становятся производными и / или зависимыми от кода.Могут быть веские основания для того, чтобы настройки реагировали в соответствии с локальными настройками, что заставляет импорт файла local_settings
приближаться к середине settings.py
.Я нахожу, что вещи начинают запутываться, когда это происходит.
Мое текущее решение - использовать файл config
, я называю его "local.ini".Он содержит только те значения, которые действительно изменяются между развернутыми экземплярами.Нет никакого кода: они являются просто значениями и логическими значениями:
[global]
domain = 127.0.0.1:8000
database_host = 127.0.0.1
database_name = test_database
debug = Yes
google_analytics_id = UA-DEV-1
payments = testing
use_cdn = No
Имея это место, я могу обрабатывать settings.py
как любой другой фрагмент кода приложения: настроить его, зарегистрировать и развернутьбез необходимости беспокоиться о тестировании любого кода, который может скрываться в коде Python local_settings.Мой settings.py
свободен от условий гонки, которые возникают, когда более поздние настройки зависят от локальных настроек, и я могу включать и выключать функции при написании простого для понимания линейного кода.Больше не нужно торопливо настраивать файл local_settings, когда я забыл добавить какое-то новое значение, и больше нет файлов daves_local_settings.py
и bobs_local_settings.py
, попадающих в хранилище.
from ConfigParser import RawConfigParser
parser = RawConfigParser()
APPLICATION_ROOT = path.abspath(path.dirname(__file__))
parser.readfp(open(path.join(APPLICATION_ROOT, 'local.ini')))
# simple variables
DATABASE_HOST = parser.get('global', 'database_host')
DATABASE_NAME = parser.get('global', 'database_name')
# interdependencies
from version import get_cdn_version
CDN = 'd99phdomw5k72k.cloudfront.net'
if parser.getboolean('global', 'use_cdn'):
STATIC_URL = '/{}/static/{}/'.format(CDN, get_cdn_version())
else:
STATIC_URL = '/static/'
# switches
payments = parser.get('global', 'payments')
if payments == 'testing':
PAYMENT_GATEWAY_ENDPOINT = 'https://api.sandbox.gateway.com'
else:
PAYMENT_GATEWAY_ENDPOINT = 'https://api.live.gateway.com'
Если вы встретите BOFH , как у меня однажды, он был особенно взволнован возможностью вставить local.ini
в каталог /etc
как /etc/ourapp.ini
и, таким образом, сохранить сам каталог приложения в чистом экспорте репозитория.Конечно, вы можете сделать это с помощью local_settings.py, но последнее, что он хотел сделать, - это возиться с кодом Python.Простой файл конфигурации, который он мог обработать.