安装了多个CKAN扩展时,它们似乎相互覆盖。 {{1}}
如果plugin1和plugin2都修改了页面的外观(jinja tempaltes),则似乎plugin1优先于plugin2。这总是这样吗?
功能(功能等)如何?找不到与此相关的代码或文档。
答案 0 :(得分:2)
关于模板,左侧列出的插件优先于右侧列出的插件。在您的示例中,如果所有三个插件提供的模板均与plugin1
的模板相同,则将使用该模板。
但是,这并不意味着其他插件所做的模板更改会完全丢失:实现模板时,插件可以决定使用ckan_extends
语法扩展现有模板
如果您的示例中的每个插件都在同一模板上使用ckan_extends
,则plugin3
扩展了该模板的CKAN基本版本,plugin2
扩展了plugin3
的基本版本,最后,plugin1
扩展了plugin2
的范围。如果其中一个插件不使用ckan_extends
,则该链断开。
在其他情况下,通常按列出顺序(从左到右)调用插件。例如,如果plugin1
和plugin2
都实现了IMiddleware
接口,则首先调用plugin1.make_middleware
并将其结果传递到plugin2.make_middleware
。
这也意味着,当左侧的插件为资源视图类型,模板助手等使用相同的名称时,它们将覆盖右侧的插件。有关更多信息,请参见CKAN文档中的the section on avoiding name clashes。
对于通过IActions
定义的动作功能,您可以使用ckan.plugins.toolkit.chained_action
装饰器来扩展现有的动作功能,而不是替换它们(类似于模板继承)。通过IAuthFunctions
定义的 auth函数同样适用,您可以在其中使用ckan.plugins.toolkit.chained_auth_function
装饰器。