Использование схемы вызова вставки при запуске приложения Pyramid

У меня есть приложение Pyramid, которое я могу начать использовать pserve some.ini. Файл ini содержит обычную конфигурацию вставки, и все работает нормально. В производстве я использую uwsgi с записью paste = config:/path/to/some.ini, которая тоже отлично работает.

Но вместо того, чтобы читать мою конфигурацию из статического ini-файла, я хочу получить ее из какого-то внешнего хранилища значений ключа. Прочитав документацию paste и исходный код, я понял, что существует схема call, которая вызывает функцию python для получения «настроек».

Я реализовал некоторый метод get_conf и пытаюсь запустить свое приложение, используя pserve call:my.module:get_conf. Если модуль/метод не существует, я получаю соответствующую ошибку, поэтому метод, похоже, используется. Но что бы я ни возвращал из метода, я получаю это сообщение об ошибке:

AssertionError: протокол неизвестен

Я понятия не имею, какое ожидаемое возвращаемое значение метода и как его реализовать. Я пытался найти документацию или примеры, но безуспешно. Как мне реализовать этот метод?


person Achim    schedule 27.11.2015    source источник


Ответы (1)


Хотя это и не ответ на ваш точный вопрос, я думаю, что это ответ на то, что вы хотите сделать. Когда пирамида запускается, переменные вашего ini-файла из ini-файла просто анализируются в объект настроек, который установлен в вашем реестре, и вы получаете к ним доступ через реестр из остальной части вашего приложения. Поэтому, если вы хотите получить настройки где-то еще (скажем, env vars или какой-либо другой сторонний источник), все, что вам нужно сделать, это создать себе фабричный компонент для их получения и использовать его в методе запуска сервера, который обычно находится в ваш базовый файл _ _ init _ _.py. Вам не нужно ничего получать из ini-файла, если это неудобно, а если нет, не имеет значения, как вы его развернете. Остальной части вашего приложения не нужно знать, откуда они взялись. Вот пример того, как я делаю это для получения настроек из env vars, потому что у меня есть распределенное приложение с тремя отдельными процессами, и я не хочу возиться с тремя наборами ini-файлов (вместо этого у меня есть один файл env vars, который не входит в git и получает источник до того, как что-либо будет включено):

# the method that runs on server startup, no matter
# how you deploy. 
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application."""

    # settings has your values from the ini file
    # go ahead and stick things it from any source you'd like
    settings['db_url'] = os.environ.get('DB_URL')
    config = Configurator(
        settings=settings,
    # your other configurator args
    )
    # you can also just stick things directly on the registry
    # for other components to use, as everyone has access to
    # request.registry. 
    # here we look in an env var and fall back to the ini file
    amqp_url = os.environ.get('AMQP_URL', settings['amqp.url'] )
    config.registry.bus = MessageClient( amqp_url=amqp_url )

    # rest of your server start up code.... below
person Iain Duncan    schedule 01.12.2015