【问题标题】:Why can't xmlrpc client append item to list accessable via xmlrpc server procedure?为什么 xmlrpc 客户端不能将项目附加到可通过 xmlrpc 服务器过程访问的列表?
【发布时间】:2011-07-27 01:59:37
【问题描述】:

服务器代码(基于 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?

【问题讨论】:

  • 对于其他也发现此问题的人,我发现当服务器关闭并且客户端向服务器发送请求时,除非启用了 allow_none,否则导致无法编组 None

标签: python xml-rpc simplexmlrpcserver xmlrpcclient


【解决方案1】:

您的 XMLRPC 服务器出现故障,因为它无法编组 None。您需要在服务器构造函数中添加allow_none=True

server = SimpleXMLRPCServer(("127.0.0.1", 8000),
                        requestHandler=RequestHandler, 
                        allow_none=True)

【讨论】:

  • 我还要指出,这个None 来自服务器上的append() 函数没有返回任何内容;因此它返回None,并且当XMLRPC 机制尝试将None 作为返回值封送回客户端时,该异常被抛出。
【解决方案2】:

错误消息是不言自明的。

append() 返回 None ,除非 你指定allow_none。

阅读错误消息和 API 文档

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

是你的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2011-06-10
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多