我有一个处理程序,可以将成员添加到组中。此处理程序中的最后一行导致错误:
TypeError: Can't pickle objects in acquisition wrappers.
> /home/mnieber/.buildout/eggs/ZODB3-3.10.3-py2.6-linux-i686.egg/ZODB/serialize.py(431)_dump()
430 self._p.dump(classmeta)
--> 431 self._p.dump(state)
432 self._file.truncate()在pdb调试器中,我可以看到Plone确实在尝试提取一个值,该值是一个采集包装器:
ipdb> state
((((<PloneUser 'newuser@usecm.com'>, ('Default_Group',), 'maarten@usecm.com', ('PAS',)),),),)
ipdb> type(state[0][0][0][0])
<type 'Acquisition.ImplicitAcquisitionWrapper'>但是,我看不到哪个对象正在被酸洗,因此我不知道我的代码的哪一部分需要修复。我的问题是:我应该如何调试这个错误?我试着查看了所有堆栈帧,但它们都没有显示出正在序列化的是哪个对象。
处理程序是这样的(run_insecure是一个装饰器,我使用它临时安装一个新的安全管理器,以避免在添加新成员时出现NotAuthorized错误):
@adapter(IPrincipalCreatedEvent)
@run_insecure
def userCreatedHandler(event):
portal_groups = getToolByName(getSite(), "portal_groups")
membersGroup = portal_groups.getGroupById('Default_Group')
membersGroup.addMember(event.principal)完整的错误是这样的:
Traceback (innermost last):
Module ZPublisher.Publish, line 134, in publish
Module Zope2.App.startup, line 301, in commit
Module transaction._manager, line 89, in commit
Module transaction._transaction, line 329, in commit
Module transaction._transaction, line 443, in _commitResources
Module ZODB.Connection, line 567, in commit
Module ZODB.Connection, line 623, in _commit
Module ZODB.Connection, line 658, in _store_objects
Module ZODB.serialize, line 422, in serialize
Module ZODB.serialize, line 431, in _dump
TypeError: Can't pickle objects in acquisition wrappers.
> /home/mnieber/.buildout/eggs/ZODB3-3.10.3-py2.6-linux-i686.egg/ZODB/serialize.py(431)_dump()
430 self._p.dump(classmeta)
--> 431 self._p.dump(state)
432 self._file.truncate()发布于 2012-03-01 04:08:17
我遇到了这种酸菜问题,并像你一样通过调试解决了。
Pickle (用于在ZODB中存储对象)试图序列化您的PloneUser,并引发此acquisition wrapper错误。
在我的例子中,我将portal_workflow对象包装到另一个class中,并且必须从pickle.Pickler继承它,并覆盖__getstate__方法来解决我的问题。
pickle调用此方法是为了序列化您的对象。如果重写此方法,并返回不带此PloneUser的object.__dict__,则不会引发此错误。
这个question (虽然不是你的确切问题)有更多关于我想说的内容的信息。
很高兴你能解决你的问题。
https://stackoverflow.com/questions/8311648
复制相似问题