Плохое взаимодействие между Zope2 XML-RPC и мутатором AT Image?

Я создаю демонстрацию для mr.migrator и столкнулся с неприятной проблемой, здесь:

# create image
proxy = xmlrpclib.ServerProxy(url) # reset
data = open('screenshot.png').read()
try:
    proxy.invokeFactory('Image', 'screenshot.png')
except xmlrpclib.ProtocolError:
    print sys.exc_info()[1]
except xmlrpclib.Fault:
    print "The id is invalid - it is already in use." # most likely
proxy = xmlrpclib.ServerProxy(url + '/screenshot.png')
proxy.setTitle('This is an image')
try:
    proxy.setImage(data) # XXX this fails
except:
    print sys.exc_info()[1]

Этот код должен заполнять поле изображения данными из изображения, но вместо этого он последовательно дает сбой:

<ProtocolError for admin:admin@localhost:8080/Plone/screenshot.png: 500 Internal Server Error>

Хуже того, это все, что говорит Zope2. Я не вижу никаких трассировок или чего-то еще, что указывало бы на проблему при запуске Plone на переднем плане.

Какой мой следующий шаг? Вы можете проверить и воспроизвести это здесь:

Я бы сделал это "обычным" способом, передав аргументы ключевого слова в invokeFactory, но XML-RPC их не поддерживает.


person aclark    schedule 17.10.2011    source источник


Ответы (1)


Скорее всего, это ошибка специального символа. Протокол xml-rpc может использовать любые символы, которые XML позволяет использовать. Вы должны попытаться обернуть данные изображения в двоичную оболочку:

wrappedData = xmlrpclib.Binary(open('screenshot.png').read())

Больше информации:

person Giacomo Spettoli    schedule 17.10.2011
comment
Прогресс, теперь я получаю: TypeError: («Не удалось адаптировать», экземпляр ‹xmlrpclib.Binary по адресу 0x111246440›, ‹InterfaceClass plone.app.blob.interfaces.IBlobbable›), который, как я подозреваю, можно обойти, пометив xmlrpclib.Binary или используя другую бинарную оболочку, которую поддерживают большие двоичные объекты? - person aclark; 18.10.2011
comment
Я думаю, вы могли бы добавить адаптер из xmlrpclib.Binary в IBlobbable, взяв в качестве примера адаптер из StringIO в IBlobbable (svn.plone.org/svn/plone/plone.app.blob/trunk/src/plone/app/blob/) - person Giacomo Spettoli; 18.10.2011
comment
Готово: github. com/aclark4life/plone.app.blob/blob/master/src/plone/app/ - person aclark; 19.10.2011
comment
Вау... Я просто подумал, что это нужно добавить в пакет p.a.blob, потому что это может быть полезно и для других. Очень хороший :) - person Giacomo Spettoli; 20.10.2011