2011-11-29 41 views
1

我有一個將成員添加到組的處理程序。在此處理程序中的最後一行導致錯誤:如何調試「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() 
+0

我找到一種方法來防止問題的發生(這不提供我最初的問題,可以用於上述錯誤的調試方法)。將成員添加到組中的代碼應該是: portal_groups = getToolByName(getSite(), 「portal_groups」) membersGroup = portal_groups.getGroupById( 'DEFAULT_GROUP') portal_groups.addPrincipalToGroup(event.principal.getId() ,membersGroup.getId()) – mnieber

回答

2

我得到了這樣的問題與泡菜,並通過調試像你一樣解決。

Pickle(用於在ZODB中存儲對象)試圖序列化您的PloneUser,並且提出acquisition wrapper錯誤。

以我爲例,我是包裹portal_workflow對象到另一個class,並不得不從pickle.Pickler繼承它,並覆蓋__getstate__的方法來解決我的問題。

這個方法被pickle調用來序列化你的對象。如果您重寫此方法,並且返回object.__dict__而沒有此PloneUser,則不會引發此錯誤。

question(雖然不是你確切的問題)有更多的信息關於我想說什麼。

不錯,你可以解決你的問題。

相關問題