Ответ 1
Я много изучил и играл с множеством разных подходов. Однако Pyramid настолько гибкая, и парсер .ini
config настолько минимален в том, что он делает для вас, что, похоже, не является де-факто ответом.
В моем сценарии я попытался сначала иметь production.example.ini
в управлении версиями, который был скопирован на производственном сервере с заполненными деталями, но это получило волосатый вид, поскольку обновления к примеру не были переведены в копию, и поэтому копия должна была быть вновь создана в любое время, когда было сделано изменение. Кроме того, я начал использовать Heroku, поэтому файлы, не имеющие контроля версий, никогда не попадали в развертывание.
Затем существует зашифрованный config-подход. Который, мне не нравится парадигма. Представьте, что системный администратор отвечает за поддержание производственной среды, но он или она не могут изменить местоположение базы данных или настройки, зависящие от конкретной среды, без ее запуска через контроль версий. Очень приятно иметь разделение между окружающей средой и кодом как можно больше, чтобы эти изменения могли выполняться "на лету" без пересмотров версий.
Мое окончательное решение состояло в том, чтобы иметь некоторые значения, которые выглядели так:
[app:main]
sqlalchemy.url = ${SQLALCHEMY_URL}
Затем на рабочем сервере я бы установил переменную среды SQLALCHEMY_URL
, чтобы указать на базу данных. Это даже позволило мне использовать тот же файл конфигурации для постановки и производства, что приятно.
В моей инициализации Pyramid я просто расширил значение переменной среды, используя os.path.expandvars
:
sqlalchemy_url = os.path.expandvars(settings.get('sqlalchemy.url'))
engine = create_engine(sqlalchemy_url)
И, если вы хотите получить представление об этом и автоматически заменить все переменные среды в словаре настроек, я сделал этот небольшой вспомогательный метод для своих проектов:
def expandvars_dict(settings):
"""Expands all environment variables in a settings dictionary."""
return dict((key, os.path.expandvars(value)) for
key, value in settings.iteritems())
Используйте его так, как показано в пункте входа в приложение main
:
settings = expandvars_dict(settings)