【问题标题】:Twisted XML-RPC error扭曲的 XML-RPC 错误
【发布时间】:2011-04-14 07:00:01
【问题描述】:

当我在http://buildbot.twistedmatrix.com/builds/sphinx-html/291-15849/projects/web/howto/xmlrpc.html 运行第一个示例时,客户端和服务器端都出现异常。我使用的服务器代码如下:

from twisted.web import xmlrpc, server

class Example(xmlrpc.XMLRPC):
    """An example object to be published."""

    def xmlrpc_echo(self, x):
        """
        Return all passed args.
        """
        return x

    def xmlrpc_add(self, a, b):
        """
        Return sum of arguments.
        """
        return a + b

    def xmlrpc_fault(self):
        """
        Raise a Fault indicating that the procedure should not be used.
        """
        raise xmlrpc.Fault(123, "The fault procedure is faulty.")

if __name__ == '__main__':
    from twisted.internet import reactor
    r = Example()
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

客户端如下:

import xmlrpclib

s = xmlrpclib.Server('http://localhost:7080/')
print s.echo('Hello world')

服务器端异常是:

Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/twisted/web/xmlrpc.py", line 150, in render_POST
    d.addCallback(self._cbRender, request, responseFailed)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 260, in addCallback
    callbackKeywords=kw)
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 249, in addCallbacks
    self._runCallbacks()
  File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 441, in _runCallbacks
    self.result = callback(self.result, *args, **kw)
--- <exception caught here> ---
  File "/usr/lib/python2.6/dist-packages/twisted/web/xmlrpc.py", line 170, in _cbRender
    allow_none=self.allowNone)
exceptions.TypeError: dumps() got an unexpected keyword argument 'allow_none'

客户端异常是:

Traceback (most recent call last):
  File "./client.py", line 6, in <module>
    print s.echo('Hello world')
  File "/usr/local/lib/python2.6/dist-packages/xmlrpclib-1.0.1-py2.6.egg/xmlrpclib.py", line 986, in __call__
    return self.__send(self.__name, args)
  File "/usr/local/lib/python2.6/dist-packages/xmlrpclib-1.0.1-py2.6.egg/xmlrpclib.py", line 1239, in __request
    verbose=self.__verbose
  File "/usr/local/lib/python2.6/dist-packages/xmlrpclib-1.0.1-py2.6.egg/xmlrpclib.py", line 1037, in request
    return self._parse_response(h.getfile(), sock)
  File "/usr/local/lib/python2.6/dist-packages/xmlrpclib-1.0.1-py2.6.egg/xmlrpclib.py", line 1136, in _parse_response
    p.close()
  File "/usr/local/lib/python2.6/dist-packages/xmlrpclib-1.0.1-py2.6.egg/xmlrpclib.py", line 508, in close
    self._parser.Parse("", 1) # end of data
xml.parsers.expat.ExpatError: no element found: line 1, column 0

【问题讨论】:

    标签: python twisted xml-rpc


    【解决方案1】:

    您好像有旧版本的 xmlrpclib?

    你用的是什么版本的python? 您的 xmlrpc 服务器正在使用的 xmlrpclib 来自哪里,它是什么版本?

    $ python -v
    >>> import xmlrpclib
    # /usr/lib/python2.6/xmlrpclib.pyc matches /usr/lib/python2.6/xmlrpclib.py
    >>> xmlrpclib.__version__
    '1.0.1'
    >>> xmlrpclib.dumps((None,), allow_none=True)
    '<params>\n<param>\n<value><nil/></value></param>\n</params>\n
    

    即这对我有用。也许您正在以某种方式使用旧版本的 xmlrpclib?

    【讨论】:

    • 我用的是和你一样的版本,1.0.1。我昨天很容易安装它。当我执行 xmlrpclib.dumps((None,), allow_none=True) 时,我得到 TypeError: dumps() got an unexpected keyword argument 'allow_none'
    • 当我将 xmlrpclib.py 复制到我的 server.py 并运行它时,它可以工作,所以我的 xmlrpclib 应该没有任何问题。我重新编译了 xmlrpclib.pyc 以确保 pyc 是正确的,我仍然得到异常。
    • xmlrpclib 是 python 的标准配置(我认为是 2.2 以后的版本)。您应该卸载站点包中的那个,并使用上面的 /usr/lib/python2.6/xmlrpclib.pyc 中的那个。如果您在执行导入时查看 python -v 的详细输出,您应该会看到您正在使用来自 site-packages 的包,该包具有不同版本的转储,缺少 allow_none 关键字参数。
    • 哇,它现在可以工作了。这个问题现在看起来很蹩脚。感谢您的帮助!
    • 很高兴。我什至挖出了在(python 2.3)hg.python.org/cpython/rev/2ba20fc9f495#l1.47987654321@ 中添加了 allow_none 的变更集
    猜你喜欢
    • 2011-04-15
    • 2012-02-16
    • 2016-08-09
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2011-10-21
    • 2014-03-28
    • 2012-07-26
    相关资源
    最近更新 更多