动态添加路线到金字塔

时间:2012-03-10 08:21:10

标签: python plugins pyramid

我想知道如何在运行时编辑金字塔注册表。好吧,我不太确定我要编辑的内容。

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

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

有人安装我的运行金字塔的appserver ...然后安装一些插件

pip install page_plugin

然后在/ configs

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

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

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

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

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

如果需要,

install / uninstall用于设置数据库

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

[编辑]

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

1 个答案:

答案 0 :(得分:2)

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

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,则路由永远不会匹配,并且实际上会被忽略。

相关问题