Pregunta

Esta pregunta se relaciona con ¿Cómo manejamos Python xmlrpclib Conexión rechazada ?

Cuando intento utilizar el código siguiente, con mi servidor RPC abajo, _get_rpc () devuelve falso y estoy listo para salir. Sin embargo, si el servidor está en funcionamiento, se produce un error con el método desconocido. ¿Está intentando ejecutar .Connect () en el servidor remoto? ¿Cómo puedo evitar esto, cuando tenía que usar .Connect () para detectar si el proxy devuelto trabajó (ver pregunta relacionada)?

import xmlrpclib
import socket

def _get_rpc():
    try:
        a = xmlrpclib.ServerProxy('http://dd:LNXFhcZnYshy5mKyOFfy@127.0.0.1:9001')
        a.connect()     # Try to connect to the server
        return a.supervisor
    except socket.error:
        return False


if not _get_rpc():
    print "Failed to connect"

Aquí está el problema:

ahiscox@lenovo:~/code/dd$ python xmlrpctest2.py
Failed to connect
ahiscox@lenovo:~/code/dd$ supervisord -c ~/.supervisor # start up RPC server
ahiscox@lenovo:~/code/dd$ python xmlrpctest2.py
Traceback (most recent call last):
  File "xmlrpctest2.py", line 13, in <module>
    if not _get_rpc():
  File "xmlrpctest2.py", line 7, in _get_rpc
    a.connect()     # Try to connect to the server
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1253, in request
    return self._parse_response(h.getfile(), sock)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1392, in _parse_response
    return u.close()
  File "/usr/lib/python2.6/xmlrpclib.py", line 838, in close
    raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: 'UNKNOWN_METHOD'>
¿Fue útil?

Solución

Bueno, yo estaba mirando a ella; mi viejo método chupar porque xmlrpclib.ServerProxy intento para conectar con el servidor XMLRPC cuando se llama a un método, no antes !!!

Pruebe esto en su lugar:

import xmlrpclib
import socket

def _get_rpc():
    a = xmlrpclib.ServerProxy('http://dd:LNXFhcZnYshy5mKyOFfy@127.0.0.1:9001')

    try:
        a._()   # Call a fictive method.
    except xmlrpclib.Fault:
        # connected to the server and the method doesn't exist which is expected.
        pass
    except socket.error:
        # Not connected ; socket error mean that the service is unreachable.
        return False, None

    # Just in case the method is registered in the XmlRPC server
    return True, a

connected, server_proxy = _get_rpc():
if not connected
    print "Failed to connect"
    import sys
    sys.exit(1)

Para resumir esta tenemos 3 casos:

  1. servidor XMLRPC está en marcha y en ella nos define un método llamado _ () : gratis ( Editar : i hizo elegir el nombre _ porque poco probable que tenga un método con este nombre, pero este caso todavía puede suceder)
    En este caso no es una excepción será la captura y el código se ejecutará la return True

  2. servidor XMLRPC está en marcha y en ella no tenemos ninguna llamada al método methoded _ () ??:
    Este xmlrpclib.Fault tiempo se levantó y también pasará a la return True

  3. servidor XMLRPC se ha reducido :
    Ahora la excepción socket.error será levantado y que cuando llamamos a._() por lo que debemos return False

No sé si hay una manera fácil de hacer esto y yo le encantará ver que hasta entonces, espero que esta cosa fijar puede esta vez:)

N.B:. Cuando lo hace if a: pitón volverá a buscar una __nonzero__() método para probar el valor booleano de a y esto dejará

Nota 2: Algunos servicios xmlrpc ofrecer una vía de RPC especializado para realizar una autenticación, en este camino de los métodos de la oferta de servicios como login () ..., este tipo de método puede reemplazar el método _ () en nuestro caso, por lo sólo llamar login (), será suficiente para saber si el servicio es hacia arriba o hacia abajo (socket.error), y en el mismo tiempo de este inicio de sesión () método de autenticar al usuario si el servicio está arriba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top