CKAN扩展相互覆盖,正确的顺序是什么?

Jun*_*Yin 2 ckan

当安装多个 CKAN 扩展时,它们似乎会相互覆盖。e.g.ckan.plugins = pulgin1, plugin2, plugin3

如果plugin1和plugin2都修改页面的外观(jinja tempaltes),则plugin1似乎优先于plugin2。总是这样吗?

功能(功能等)怎么样?没有找到与此相关的代码或文档。

Flo*_*ker 5

对于模板,左侧列出的插件优先于右侧列出的插件。在您的示例中,如果所有三个插件都提供相同的模板,plugin1则将使用相同的模板。

然而,这并不意味着其他插件对模板的更改完全丢失:在实现模板时,插件可以决定使用语法扩展现有模板ckan_extends

如果示例中的每个插件都使用ckan_extends相同的模板,则plugin3扩展 CKAN 的该模板的基本版本,plugin2扩展 的版本plugin3,最后plugin1扩展 的版本plugin2。如果其中一个插件不使用,ckan_extends那么该链条就被破坏了。

在其他情况下,插件通常按照它们列出的顺序(从左到右)调用。例如,如果 和 都plugin1实现plugin2了该IMiddleware接口,则plugin1.make_middleware首先调用 then 并将其结果传递给plugin2.make_middleware.

这也意味着当左侧列出的插件对资源视图类型、模板助手等使用相同名称时,它们会覆盖右侧列出的插件。有关更多信息,请参阅 CKAN 文档中有关避免名称冲突的部分。

对于通过 定义的动作函数IActions,您可以使用ckan.plugins.toolkit.chained_action装饰器来扩展现有的动作函数,而不是替换它们(类似于模板继承)。这同样适用于通过 定义的auth 函数IAuthFunctions,您可以在其中使用ckan.plugins.toolkit.chained_auth_function装饰器。