我有一個將成員添加到組的處理程序。在此處理程序中的最後一行導致錯誤:如何調試「TypeError:無法在採集包裝中醃製對象」。在Plone中
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 '[email protected]'>, ('Default_Group',), '[email protected]', ('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()
我找到一種方法來防止問題的發生(這不提供我最初的問題,可以用於上述錯誤的調試方法)。將成員添加到組中的代碼應該是: portal_groups = getToolByName(getSite(), 「portal_groups」) membersGroup = portal_groups.getGroupById( 'DEFAULT_GROUP') portal_groups.addPrincipalToGroup(event.principal.getId() ,membersGroup.getId()) – mnieber