5

この質問は、Pythonxmlrpclib接続拒否をどのように処理するかに関するものです。

RPCサーバーをダウンさせた状態で次のコードを使用しようとすると、_get_rpc()はFalseを返し、問題ありません。ただし、サーバーが実行されている場合は、不明な方法で失敗します。リモートサーバーで.connect()を実行しようとしていますか?返されたプロキシが機能したかどうかを検出するために.connect()を使用する必要がある場合、これを回避するにはどうすればよいですか(関連する質問を参照)。

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"

ここに問題があります:

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'>
4

1 に答える 1

5

さて、私はちょうどそれを調べていました; xmlrpclib.ServerProxyメソッドを呼び出すときは、前ではなく、XmlRPCサーバーに接続しようとするので、私の古いメソッドは最悪です!!!

代わりにこれを試してください:

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)

これを要約すると、3つのケースがあります。

  1. XmlRPCサーバーが稼働していて、その中で_()というメソッドを定義しました
    :(編集 この名前のメソッドがない可能性があるため、名前を選択しました_が、この場合は引き続き発生する可能性があります)
    この場合、例外は発生しません。コードはを実行しますreturn True

  2. XmlRPCサーバーが稼働していて、その中にメソッド呼び出し_()がありません
    今回xmlrpclib.Faultは発生し、return True

  3. XmlRPCサーバーがダウンしています
    これでsocket.error例外が発生し、呼び出すと例外が発生しa._()ます。return False

これを行う簡単な方法があるかどうかはわかりません。それまでは見たいと思います。今回はこれで問題が解決することを願っています:)

注意: Pythonを実行すると、のブール値をテストif a:するメソッドが再度検索されますが、失敗します。__nonzero__()a

注意2:一部のxmlrpcサービスは、認証を行うために特化したrpcパスを提供します。このパスでは、login()などのサービス提供メソッドがあります。この種類のメソッドは、この場合は_()メソッドを置き換えることができるため、loginを呼び出すだけです。 ()は、サービスがアップしているかダウンしているか(socket.error)を知るのに十分であり、同時にこのlogin()メソッドはサービスがアップしているかどうかをユーザーに認証します。

于 2011-01-17T18:46:55.823 に答える