Почему клиент xmlrpc не может добавить элемент в список, доступный через процедуру сервера xmlrpc? - PullRequest
1 голос
/ 31 марта 2011

Код сервера (на основе ссылки на библиотеку Python):

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ()

server = SimpleXMLRPCServer(("127.0.0.1", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()

l = list()

def say_hi():
    return 'hi !'

def append(event):
    l.append(event)

server.register_function(say_hi)
server.register_function(append)

server.serve_forever()

Клиент (переводчик запущен из другого окна терминала):

>>> from xmlrpc.client import ServerProxy
>>> s = ServerProxy('http://127.0.0.1', allow_none=True)
>>> s.say_hi()
'hi !'
>>> s.append(1)
Traceback (most recent call last):
...
xmlrpc.client.Fault(Fault 1: "<class 'TypeError'>:cannot
                    marshal None unless allow_none is enabled")

Как это исправить?Я неправильно использую xmlrpc?

Ответы [ 2 ]

10 голосов
/ 31 марта 2011

Ваш сервер XMLRPC вызывает ошибку, поскольку он не может выполнить маршалинг None.Вам нужно добавить allow_none=True в конструктор сервера:

server = SimpleXMLRPCServer(("127.0.0.1", 8000),
                        requestHandler=RequestHandler, 
                        allow_none=True)
0 голосов
/ 31 марта 2011

Сообщение об ошибке говорит само за себя.

append () возвращает None, который нельзя маршалировать, если только вы указываете allow_none.

Чтение сообщений об ошибках и документации API

http://docs.python.org/library/simplexmlrpcserver.html

твой друг.

...