使用金字塔中的指令和操作添加视图

时间:2014-11-20 02:04:08

标签: python pyramid

我想在金字塔配置器上创建一个指令,该指令允许应用程序导入我的库以添加连接到具有特定默认值的特定路径的视图。

我的第一次尝试(模仿pyramid docs中给出的示例):

def status_view_directive(config, view, **view_config_kwargs):
    def register_status_view():
        config.add_view(
            view=view,
            route_name='status',
            **view_config_kwargs
        )
    config.action('a_discriminator', register_status_view)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('status', '/status')
    config.add_directive('add_status_view', status_view_directive)
    config.add_status_view('some_view', **some_kwargs)
    return config.make_wsgi_app()

它不起作用。每当我尝试访问视图时,我都会返回404

如果我将代码修改为以下代码,它将按预期工作:

def status_view_directive(config, view, **view_config_kwargs):
    config.add_view(
        view=view,
        route_name='status',
        **view_config_kwargs
    )

if __name__ == '__main__':
    config = Configurator()
    config.add_route('status', '/status')
    config.add_directive('add_status_view', status_view_directive)
    config.add_status_view('some_view', **some_kwargs)
    return config.make_wsgi_app()

我失去了几个小时试图解决这个问题。有谁知道为什么第一个片段不起作用?

1 个答案:

答案 0 :(得分:1)

这就是发生的事情:

  • 调用您的指令时会注册register_status_view操作。

  • 当Pyramid执行操作时,它会执行此操作。

  • 但是,此操作会调用一个本身注册操作的指令。但是动作执行不是递归的。作为执行动作执行结果而注册的操作将被删除。

我们有一些计划在即将发布的金字塔版本中解决这个问题。但是,就目前而言,您可能只需要这样做:

def status_view_directive(config, view, **view_config_kwargs):
    config.add_view(
        view=view,
        route_name='status',
        **view_config_kwargs
        )