moyen sûr de se connecter au serveur RPC
Question
Cette question est liée à Comment pouvons-nous gérer Python xmlrpclib Connection Refused
Lorsque je tente d'utiliser le code suivant, avec mon bas serveur RPC, _get_rpc () retourne Faux et je suis bon pour aller. Toutefois, si le serveur est en cours d'exécution, il échoue avec méthode inconnue. Est-il tente d'exécuter .Connect () sur le serveur distant? Comment puis-je contourner ce problème, quand je avais besoin d'utiliser .Connect () pour détecter si le proxy retourné travaillé (voir la question connexe)?
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"
Voici la question:
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'>
La solution
Eh bien, je cherchais juste pour elle; mon ancienne méthode téter parce que essayer de xmlrpclib.ServerProxy
de se connecter au serveur XmlRpc lorsque vous appelez une méthode, pas avant !!!
Essayez ceci:
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)
Pour résumer cela, nous avons 3 cas:
-
serveur XmlRpc est et en elle nous avons défini une méthode appelée _ () :
( EDIT : j'ai choisi le nom_
parce qu'il est peu probable d'avoir une méthode avec ce nom, mais ce cas peut encore arriver)
Dans ce cas, aucune exception ne sera prise et le code exécutera lereturn True
-
serveur XmlRpc est et en elle nous n'avons aucune méthode methoded appel _ () ??:
Cexmlrpclib.Fault
temps sera levé et nous allons aussi passer à lareturn True
-
serveur XmlRpc est en baisse :
Maintenant, l'exceptionsocket.error
sera soulevée et que quand nous appelonsa._()
donc nous devrionsreturn False
Je ne sais pas s'il existe un moyen facile de le faire et je vais aimer le voir jusque-là, espérons que cette chose peut fixer cette fois-ci:)
N.B.:. Quand vous faites python if a:
va chercher à nouveau une méthode __nonzero__()
pour tester la valeur booléenne de a
et cela échouera à
NB 2: Certains services xmlrpc offrent un chemin rpc spécialisé pour faire une authentification, dans ce chemin que les méthodes d'offre de services comme login () ..., ce genre de méthode peut remplacer la méthode _ () dans notre cas, donc simplement appeler connexion (), sera suffisant pour savoir si le service est ou vers le bas (socket.error), et dans le même temps cette méthode login () authentifier l'utilisateur si le service est en place.