Как использовать config.add_settings ({'pyramid.include': ...}) из включенного вызываемого - PullRequest
0 голосов
/ 09 ноября 2019

Когда я создал пирамидальное приложение по умолчанию из резца печенья, он привел к созданию файла INI с такими разделами:

[app:myapp]
use = egg:myproject#myapp
pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid.includes = pyramid_debugtoolbar

Теперь я экспериментирую с добавлением этих же настроек в код Python,используя объект Configurator в __init__.py, и я обнаружил, что следующее работает одинаково:

config.include('pyramid_debugtoolbar')
config.add_settings({
    'pyramid.reload_templates'      : 'true',
    'pyramid.debug_authorization'   : 'false',
    'pyramid.debug_notfound'        : 'false',
    'pyramid.debug_routematch'      : 'false',
    'pyramid.default_locale_name'   : 'en',
    'pyramid.includes'              : 'pyramid_debugtoolbar',
    })

Но при применении этих настроек в python, первая строка config.include('pyramid_debugtoolbar') обязательна илине работаетТем не менее, в версии INI достаточно установить pyramid.includes = pyramid_debugtoolbar.

После дальнейшего копания

Посмотрев выше в стеке моего кода, я обнаружил, что настройкаработает так ...

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application."""
    settings.update({'pyramid.includes':'pyramid_debugtoolbar'}) # SETTING HERE WORKS!
    with Configurator(settings=settings) as config:
        config.include(common_config)
        config.include('.routes')
        config.scan()

    return config.make_wsgi_app()

Но НЕ так ...

def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application."""
    with Configurator(settings=settings) as config:
        config.add_settings({'pyramid.includes':'pyramid_debugtoolbar'}) # NO EFFECT!
        config.include(common_config)
        config.include('.routes')
        config.scan()

    return config.make_wsgi_app()

В документации для pyramid.config Я обнаружил это предупреждение, которое, как я подозреваю, я имею в виду:

Вызываемая конфигурация должна быть вызываемой, которая принимает один аргумент с именем config, который будет экземпляром Configurator. Однако следует помнить, что это не будет тот же экземпляр конфигуратора, для которого вы вызываете этот метод. Код, который выполняется в результате вызова вызываемого объекта, должен вызывать методы в конфигураторе, переданные ему, которые добавляют состояние конфигурации. Возвращаемое значение вызываемого будет игнорироваться.

В попытке угадать решение, я попытался обернуть config.add_settings(...) различными комбинациями config.commit() и config.begin() / config.end()и ни один из них не сработал.

Мой вопрос:

Как использовать config.add_settings(...) для установки pyramid.includes? Я хочу сделать это в common_config() вызываемой функции, которая включена в несколько приложений пирамиды.

...