Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将路由动态添加到金字塔_Python_Plugins_Pyramid - Fatal编程技术网

Python 将路由动态添加到金字塔

Python 将路由动态添加到金字塔,python,plugins,pyramid,Python,Plugins,Pyramid,我想知道如何在运行时编辑金字塔注册表。嗯,我不太确定我到底要编辑什么 我知道我可以用config.include(…)扩展金字塔。但一旦调用config.make_wsgi_app(),似乎就无法添加路由或新的mako目录。对threadlocals或设置中注册表的任何更改都不会影响应用程序的行为 我的目标是在运行时添加插件。这里有一个用例 有人安装我的应用服务器运行金字塔…然后安装一些插件 pip安装页面插件 然后输入/配置 有一个已安装插件的列表,您可以选择哪些插件被激活或未激活。目前我只知

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

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

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

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

pip安装页面插件

然后输入/配置

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

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

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

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

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

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

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

[编辑]


没有删除路由或antyhing的功能。因此,我的猜测是,重新编码服务器可能是最容易和最简单的方式做到这一点。。。重新启动服务器可能比忘记从插件中卸载一些东西更干净

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

config = Configurator(registry=request.registry)
config.add_route(...)
config.commit()
但是,您必须注意,修改注册表不是线程安全的操作。你必须自己同步这个。与其这样做,我建议您以不同的方式思考您的问题,并尝试创建包含您预期扩展的功能的路由。Routes可以接受模式(如果您想要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,则该路由将永远不会匹配,并且实际上会被忽略。

这真的很有趣,我必须看看它,然后我会得出一些我猜是的结果。似乎效果很好,谢谢,我目前正在一个项目中使用traversal,因为我使用的是zodb,它感觉这是唯一符合逻辑的方法。我有其他mongodb项目,目前定义了自己的路由,但我相信我可以通过遍历获得相同的结果。来自塔架,我真的习惯了路由,被traversalI背后的魔法吓坏了。当你说编辑注册表不是线程安全的时候,我仍然只有一个问题。您的意思是,如果两个人正在编辑注册表,它将失败或不幸地产生一些意外的结果。我将不得不看看它是如何做到的,但我认为有两种可能性。Configurator复制配置,然后将其推送到注册表并完全覆盖。或仅推送新的或修改的配置。我猜是的。因此,如果有人在编辑时进行编辑。更改可能永远不会保存。我不认为这有什么大不了的,但要记住,我是说注册中心是金字塔的核心。它包含大量的共享状态,在为请求提供服务的所有线程之间都是只读的。如果您弄乱了这种状态,它可能会导致另一个线程(请求)出现问题,尽管它可能会工作,但绝对不能保证它会工作。