如何从组件注册表中获取所有已注册的browser:resource和browser:resourceDirectory?
我在不同的地方查找,试图发现zcml指令browser:resource创建了哪种类型的组件,并找到了带有registerAdapter调用的Products.Five.browser.metaconfigure:
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),它看起来就是我想要的,但是我找不到它的实现位置,所以我不知道如何调用它。
发布于 2013-08-13 21:33:46
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)https://stackoverflow.com/questions/18210148
复制相似问题