forma segura de conectar con el servidor de RPC
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'>
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:
-
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á lareturn True
-
servidor XMLRPC está en marcha y en ella no tenemos ninguna llamada al método methoded _ () ??:
Estexmlrpclib.Fault
tiempo se levantó y también pasará a lareturn True
-
servidor XMLRPC se ha reducido :
Ahora la excepciónsocket.error
será levantado y que cuando llamamosa._()
por lo que debemosreturn 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.