Как отладить «TypeError: Невозможно выбрать объекты в оболочках получения» в Плоне - PullRequest
1 голос
/ 29 ноября 2011

У меня есть обработчик, который добавляет участника в группу.Последняя строка в этом обработчике вызывает ошибку:

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 пытается выбрать значение, являющееся оболочкой Acquisition:

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()

1 Ответ

2 голосов
/ 01 марта 2012

У меня возникла такая проблема с рассолом, и она была решена путем отладки, как у вас.

Pickle (используется для хранения объектов в ZODB) пытается сериализовать ваш PloneUser и вызывает эту ошибку acquisition wrapper.

В моем случае я обернул объект portal_workflow в другой class, и мне пришлось унаследовать его от pickle.Pickler и переопределить метод __getstate__, чтобы решить мою проблему.

Этот метод вызывается pickle для сериализации вашего объекта. Если вы переопределите этот метод и вернете свой object.__dict__ без этого PloneUser, эта ошибка не возникнет.

Этот вопрос (хотя и не с вашей конкретной проблемой) содержит больше информации о том, что я пытаюсь сказать.

Хорошо, что вы можете решить свою проблему.

...