Plone/Zope/ZODB:如何重写文件字段上的存储方法

2024-04-18 19:20:02 发布

您现在位置:Python中文网/ 问答频道 /正文

“我想让用户关闭我的产品”字段。文件将存储在其他地方。我好像做不到。在

下面是我的尝试。我无法让Products.Archetypes.Field.ObjectField.setStorage()识别这个'noStorage'实例“提供”IStorage。在

为了简洁起见,删除了许多无关紧要的代码,但是完整的源代码可以在https://github.com/flipmcf/rfa.kaltura找到


原型模式包括ATBlob.schema”以拉入“文件”字段,然后:

class KalturaVideo(ATBlob, KalturaBase.KalturaContentMixin):

    nostorage = NoStorage()
    directlyProvides(nostorage, INoStorage)

    def __init__(self, oid, **kwargs):
        if settings.storageMethod == u"No Local Storage":
            import pdb; pdb.set_trace() # 
            #(Pdb) IStorage.providedBy(self.nostorage)
            #True
            self.getField('file').setStorage(self, self.nostorage)

我的存储类和接口非常无聊:

^{pr2}$

configure.zcml在'storage'包中还:

^{3}$

现在,在setStorage()方法中:

def setStorage(self, instance, storage):
    import pdb; pdb.set_trace()
    #(Pdb) IStorage.providedBy(storage)
    #False
    #HeadDesk
    if not IStorage.providedBy(storage):
        raise ObjectFieldException, "Not a valid Storage method"

当我调试时,IStorage.providedBy(storage)返回False

为什么它在调用代码的setStorageTrue中返回False?我没有正确注册接口吗?在


Tags: 文件代码importselffalseifdefstorage
1条回答
网友
1楼 · 发布于 2024-04-18 19:20:02

请注意,在模块Products.Archetypes.Field中,IStorage实例实际上来源于:

from Products.Archetypes.interfaces.storage import IStorage

比较接口解析顺序(通过__iro__)我们得到

^{pr2}$

由于INoStorage是从ZODB.interfaces.IStorage派生的子类,并且该接口类不是setStorage调用providedBy的{}的父类,因此作为define的NoStorage类将不满足该检查。要解决这个问题,只需让INoStorage简单地继承IStorage的原型版本并实现其所有方法,它就可以按预期工作了。在

也就是说,您可以简单地将代码与提供接口的方式更进一步,请参见以下示例:

>>> class INoStorage(Products.Archetypes.interfaces.storage.IStorage):
...     pass
... 
>>> class NoStorage(object):
...     zope.interface.implements(INoStorage)
... 
>>> nostorage = NoStorage()
>>> Products.Archetypes.interfaces.storage.IStorage.providedBy(nostorage)
True

Interface子类的继承将在没有额外的directlyProvides定义的情况下正确地持续存在,因此您只需在KalturaVideo类定义中删除额外的调用。当然,您可以只做from ... import IStorage并简单地对class INoStorage(IStorage)进行操作。这样做的例子是为了使事情更加明确可见。在

相关问题 更多 >