当安装多个 CKAN 扩展时,它们似乎会相互覆盖。 例如ckan.plugins = pulgin1,plugin2,plugin3
如果plugin1和plugin2都修改页面的外观(jinja tempaltes),则plugin1似乎优先于plugin2。总是这样吗?
功能(函数等)怎么样?没有找到与此相关的代码或文档。
最佳答案
对于模板,左侧列出的插件优先于右侧列出的插件。在您的示例中,如果所有三个插件都提供相同的模板,则将使用 plugin1
的模板。
但是,这并不意味着其他插件对模板所做的更改完全丢失:在实现模板时,插件可以决定使用ckan_extends
扩展现有模板。语法。
如果示例中的每个插件在同一模板上使用 ckan_extends
,则 plugin3
会扩展 CKAN 的该模板的基本版本 plugin2
扩展了 plugin3
的内容,最后 plugin1
扩展了 plugin2
的内容。如果其中一个插件不使用ckan_extends
,那么该链就会被破坏。
在其他情况下,插件通常按其列出的顺序(从左到右)调用。例如,如果 plugin1
和 plugin2
都实现 IMiddleware
接口(interface),然后首先调用 plugin1.make_middleware
并将其结果传递给 plugin2.make_middleware
。
这也意味着,当左侧列出的插件对资源 View 类型、模板助手等使用相同名称时,会覆盖右侧列出的插件。请参阅 the section on avoiding name clashes在 CKAN 文档中了解更多信息。
对于通过 IActions
定义的操作函数 ,您可以使用ckan.plugins.toolkit.chained_action
装饰器来扩展现有的操作函数而不是替换它们(类似于模板继承)。这同样适用于通过 IAuthFunctions
定义的验证函数 ,您可以在其中使用 ckan.plugins.toolkit.chained_auth_function
装饰器。
关于CKAN扩展相互覆盖,正确的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52936903/