質問
この質問はに関連しています Python xmlrpclib接続を拒否するにはどうすればよいですか?
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'>
解決
さて、私はそれを見ていました。私の古い方法は吸うからです 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つのケースがあります。
XMLRPCサーバーがアップしており、その中に_()と呼ばれるメソッドを定義しました:
(編集 :名前を選択しました_
この名前の方法がありそうにないからですが、このケースはまだ発生する可能性があります)
この場合、例外はキャッチされず、コードはreturn True
XMLRPCサーバーがアップしており、その中にメソッドメソッドコール_()がありません:
今回xmlrpclib.Fault
育てられ、私たちもreturn True
XMLRPCサーバーはダウンしています:
今socket.error
例外が提起され、それを呼び出すときにそれを提起しますa._()
だから私たちはすべきですreturn False
これを行う簡単な方法があるかどうかはわかりません。それまで見たいと思います。これが今回のことを修正できることを願っています:)
NB:そうするとき if a:
Pythonは再びメソッドを検索します __nonzero__()
のブール値をテストします a
そして、これは失敗します。
NB 2:一部のXMLRPCサービスは、認証を行うために特化したRPCパスを提供しています。このパスでは、サービスがログイン()などの方法を提供します。 ()、サービスがアップまたはダウン(socket.error)であるかどうかを知るのに十分であり、同時にこのlogin()メソッドがサービスがアップされている場合にユーザーを認証します。