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

CKAN extensions overwrite each other, what is the correct order?

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

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

functionalities(函数等)呢?没有找到与此或文档相关的代码。

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

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

如果您示例中的每个插件都在同一模板上使用 ckan_extends,则 plugin3 扩展了该模板的 CKAN 基本版本,plugin2 扩展了 plugin3,最后 plugin1 扩展了 plugin2。如果其中一个插件不使用 ckan_extends 则该链已损坏。

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

这也意味着当左侧列出的插件对资源视图类型、模板助手等使用相同的名称时,它们会覆盖右侧的插件。有关详细信息,请参阅 CKAN 文档中的 the section on avoiding name clashes

对于通过 IActions, you can use the ckan.plugins.toolkit.chained_action decorator to extend existing action functions instead of replacing them (similar to template inheritance). The same holds for auth functions defined via IAuthFunctions, where you can use the ckan.plugins.toolkit.chained_auth_function 装饰器定义的 动作函数