2011-11-29 3 views
1

그룹에 구성원을 추가하는 처리기가 있습니다. 내가 할 수없는, 그러나"TypeError : 수집 랩퍼에서 개체를 피클링 할 수 없습니다."디버깅하는 방법 Plone에서

ipdb> state 
((((<PloneUser '[email protected]'>, ('Default_Group',), '[email protected]', ('PAS',)),),),) 
ipdb> type(state[0][0][0][0]) 
<type 'Acquisition.ImplicitAcquisitionWrapper'> 

: 그 참 플론 (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의 디버거에서이 핸들러의 마지막 줄은 오류가 발생합니다 어떤 객체가 절인되는지 확인하고 따라서 어떤 코드 부분을 고칠 필요가 있는지 전혀 알지 못합니다. 내 질문은 :이 오류를 디버깅하는 방법에 대해 어떻게 가야합니까? 나는 모든 스택 프레임을 살펴 보았지만 어떤 객체가 직렬화되는지는 밝히지 않았다.

@adapter(IPrincipalCreatedEvent) 
@run_insecure 
def userCreatedHandler(event): 
portal_groups = getToolByName(getSite(), "portal_groups") 
membersGroup = portal_groups.getGroupById('Default_Group') 
membersGroup.addMember(event.principal) 

전체 오류이 하나입니다

핸들러 (run_insecure 내가 임시로 새 구성원을 추가 할 때 NotAuthorized 오류를 피할 새로운 보안 관리자를 설치하는 데 사용하는 장식이다)이 하나입니다 :

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를 serialize하려고 시도하고이 acquisition wrapper 오류가 발생했습니다. 내 경우

, 나는 다른 classportal_workflow 객체를 포장하고 pickle.Pickler에서 상속, 내 문제를 해결하기 __getstate__ 메소드를 오버라이드 (override) 할 수 있었다.

이 메소드는 오브젝트를 직렬화하기 위해 pickle에 의해 호출됩니다. 이 메서드를 재정의하고이 PloneUser없이 object.__dict__을 반환하면이 오류가 발생하지 않습니다.

question (정확한 문제는 아니지만) 내가 말하고자하는 것에 대한 자세한 정보가 있습니다.

멋진 문제를 해결할 수 있습니다.