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'>
Était-ce utile?

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:

  1. 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 le return True

  2. serveur XmlRpc est et en elle nous n'avons aucune méthode methoded appel _ () ??:
         Ce xmlrpclib.Fault temps sera levé et nous allons aussi passer à la return True

  3. serveur XmlRpc est en baisse :
         Maintenant, l'exception socket.error sera soulevée et que quand nous appelons a._() donc nous devrions return 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top