В веб-каркасе Pyramid, как мне настроить чувствительные параметры к development.ini/production.ini из внешнего файла? - программирование
Подтвердить что ты не робот

В веб-каркасе Pyramid, как мне настроить чувствительные параметры к development.ini/production.ini из внешнего файла?

Я хотел бы сохранить development.ini и production.ini под управлением версии, но по соображениям безопасности не нужно будет хранить строку соединения sqlalchemy.url, так как это будет содержать имя пользователя и пароль, используемые для подключения к базе данных.

Каков канонический путь в Pyramid для поиска этого параметра из дополнительного внешнего файла?

Edit В дополнение к решению, использующему переменную окружения, я придумал это решение после запроса на #pyramid:

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
# Read db password from config file outside of version control
secret_cfg = ConfigParser()
secret_cfg.read(settings['secrets'])
dbpass = secret_cfg.get("secrets", "dbpass")
settings['sqlalchemy.url'] = settings['connstr'] % (dbpass,)
4b9b3361

Ответ 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)

Ответ 2

Вся суть отдельных ini файлов в Pyramid заключается в том, что вам не нужно управлять версиями всех них и что они могут содержать разные настройки для разных сценариев (разработка/производство/тестирование). Ваш production.ini почти всегда не должен находиться в том же VCS, что и исходный код.