如何从组件注册表中获取所有已注册的browser:resource
和browser:resourceDirectory
?
我在不同的地方试图发现zcml指令browser:resource
创建了哪种组件,并通过Products.Five.browser.metaconfigure
调用找到了registerAdapter
:
handler('registerAdapter', factory, (layer,), Interface, name, _context.info)
这意味着它将注册一个需要(layer,)
并提供Interface
的适配器,但是调用以下内容不起作用(它返回一个不是浏览器资源的组件):
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
zope.component.getAdapters((IDefaultBrowserLayer,), Interface)
我不确定,但似乎getAdapters
需要一个实例。我不想查询zope.component但是要获得注册的适配器。
我在zope.interface.interfaces
中找到了一个方法lookupAll(required, provided)
,它看起来像我想要的但我无法找到它的实现位置所以我不知道如何调用它。
答案 0 :(得分:2)
zope.component.getAdapters()
需要传递一个实例。 zope.interface.registry.Components.getAdapters()
method来电:
list(map(providedBy, objects))
其中providedBy
为zope.interface.declarations.providedBy()
。 IDefaultBrowserLayer
提供的所有内容均为.. zope.interface.IInterface
和zope.interface.ISpecification
。
您需要传入提供 IDefaultBrowserLayer
的虚拟对象,而不是直接传入界面。
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
import zope.component
import zope.interface
class dummy(object):
zope.interface.classProvides(IDefaultBrowserLayer)
zope.component.getAdapters((dummy,), zope.interface.Interface)