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

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

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

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

点安装page_plugin

然后在/ configs中

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

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

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

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

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

如果需要,可以使用install / uninstall来设置数据库

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

[编辑]

没有删除路线或伤员的功能。因此,我的猜测是,重新部署服务器可能是最容易且最简单的方法...重新启动服务器可能比忘记从插件中卸载某些东西更干净。

最佳答案

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

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

关于python - 动态将路线添加到 Pyramid ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9645003/

10-14 18:08
查看更多