首页 > 解决方案 > 如何从包含的可调用对象中使用 config.add_settings({'pyramid.includes': ...})

问题描述

当我从一个千篇一律的工具创建一个默认的金字塔应用程序时,它会生成一个包含如下部分的 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()多个金字塔应用程序包含的可调用对象中执行此操作。

标签: pythonconfigsettingspyramid

解决方案


这些pyramid.*设置由Configurator的构造函数使用。这意味着它们需要在传递之前设置Configurator(settings=settings)。您可以先简单地修改这些设置,然后将它们传递给配置器。


推荐阅读