Ошибка Twisted XML-RPC

#python #twisted #xml-rpc

#python #искаженный #xml-rpc

Вопрос:

Я получаю исключение как на стороне клиента, так и на стороне сервера при запуске первого примера на 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
  

Ответ №1:

Похоже, у вас старая версия xmlrpclib?

Какую версию python вы используете? Откуда берется xmlrpclib, который использует ваш сервер xmlrpc, и какая у него версия?

 $ 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. Я использую ту же версию, что и вы, 1.0.1. Я легко установил ее вчера. Когда я выполняю xmlrpclib.dumps((None,), allow_none= True), я получаю TypeError: dumps() получил неожиданный аргумент ключевого слова ‘allow_none’

2. Когда я копирую xmlrpclib.py перейдем к моему server.py и запустите его, он работает, поэтому с моим xmlrpclib не должно быть ничего плохого. Я перекомпилировал xmlrpclib.pyc, чтобы убедиться, что pyc правильный, и я все еще получаю исключение.

3. xmlrpclib входит в стандартную комплектацию python (я думаю, 2.2 и далее). Вам следует удалить тот, который находится у вас в пакетах вашего сайта, и использовать тот, который находится в / usr / lib/python2.6 /xmlrpclib.pyc, как указано выше. Если вы посмотрите на подробный вывод из python -v, когда вы выполняете импорт, вы должны увидеть, что вы используете пакет из site-packages, который имеет другую версию дампов, в которой отсутствует аргумент ключевого слова allow_none.

4. Вау, теперь это работает. Сейчас этот вопрос кажется таким неубедительным. Спасибо за помощь!

5. С удовольствием. Я даже откопал набор изменений, в который был добавлен allow_none (python 2.3) hg.python.org/cpython/rev/2ba20fc9f495#l1.47