【问题标题】:Adding routes dynamically to pyramid动态添加路线到金字塔
【发布时间】:2012-03-27 13:12:03
【问题描述】:

我想知道如何在运行时编辑金字塔注册表。好吧,我不太确定我必须编辑什么。

我知道我可以使用 config.include(...) 扩展金字塔。但是一旦 config.make_wsgi_app() 被调用,似乎没有办法添加路由或新的 mako 目录。对 threadlocals 或设置中的寄存器的任何更改都不会影响应用程序的行为。

我的目标是在运行时添加插件。这是一个用例。

有人安装我运行金字塔的应用服务器...然后安装一些插件

pip install page_plugin

然后在 /configs 中

有一个已安装插件的列表,您可以选择激活或不激活哪些插件。目前我只知道一种方法:

使用 entry_points 我可以看到我的插件,并且在金字塔的主要功能中,我可以注册插件。使用文件存储,我可以检查每个插件的状态:[安装、安装、卸载、卸载、禁用]

这样我可以从视图安装/卸载我的插件。

为了查看任何更改,我必须重新启动服务器。

状态 install :将在下次启动时安装 已安装:已安装并处于活动状态 卸载:将在下次启动时卸载 已卸载:已卸载 disabled:未卸载但未激活

安装/卸载用于在需要时设置数据库

我认为没有其他真正的方法可以做到这一点,因为没有“remove_view”。我可能会让服务器重新加载。它会加载新的配置。

[编辑]

没有删除路由或antyhing的功能。所以我的猜测是重新加载服务器可能是最容易和最简单的方法......并且重新启动服务器可能比忘记从插件中卸载一些东西更干净。

【问题讨论】:

    标签: python plugins pyramid


    【解决方案1】:

    可以在运行时修改注册表:

    config = Configurator(registry=request.registry)
    config.add_route(...)
    config.commit()
    

    但是,您必须注意,修改注册表不是线程安全的操作。您必须自己同步。我建议不要这样做,而是以不同的方式考虑您的问题,并尝试创建包含您预期扩展的功能的路线。路由可以接受模式(如果你想要 URL 的其余部分,甚至是 .*),并且还有非常动态且易于在运行时扩展的遍历。

    添加可移动视图是可能的,但我不会在“添加或删除路由”级别这样做。相反,我建议在您的路由上使用自定义谓词来控制路由是否匹配。

    def is_enabled(info, request):
        return True if route_should_be_enabled else False
    
    config.add_route('my_plugin_head', '/foo/{bar}', custom_predicates=[is_enabled])
    

    这样,如果 is_enabled 返回 False,则路由永远不会匹配并被有效地忽略。

    【讨论】:

    • 这真的很有趣,我得去看看,我想我会想出一些结果的。
    • 似乎工作得很好,谢谢,我目前在一个项目上使用遍历,因为我使用 zodb,感觉它确实是唯一合乎逻辑的方法。我有其他 mongodb 项目,目前定义了自己的路线,但我相信我可以通过遍历获得相同的结果。来自塔架,我真的习惯了路线,并被遍历背后的魔力吓到了
    • 我还有一个问题,当你说编辑注册表不是线程安全的时候。您的意思是,如果两个人正在编辑注册表,它将失败或不幸地产生一些意想不到的结果。将不得不看看它是如何完成的,但我看到了两种可能性。配置器复制配置,然后将其推送到注册表并完全覆盖它。或者只推送新的或修改的配置。我猜它会覆盖。因此,如果有人在编辑时进行编辑。更改可能永远不会保存。我不认为这有什么大不了的,但要牢记在心。
    • 我是说注册表是金字塔的核心。它包含大量共享状态,在所有服务请求的线程之间是只读的。如果你弄乱了那个状态,它可能会导致另一个线程(请求)出现问题,虽然它可能会工作,但绝对不能保证它会。
    猜你喜欢
    • 2015-11-14
    • 2017-05-07
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2014-06-07
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多