Ну, я просто смотрю на это;мой старый метод отстой, потому что 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
Я не знаю, есть ли простой способ сделать это ия буду рад видеть его до тех пор, надеюсь, что в этот раз это можно исправить:)
Примечание: когда вы выполните if a:
python снова будет искать метод __nonzero__()
для проверки логического значения a
и это не удастся.
Примечание 2. Некоторые службы xmlrpc предлагают путь rpc, специализированный для выполнения аутентификации, в этом пути службы предлагают методы, такие как login () ..., такие методы могут заменитьв нашем случае метода _ (), поэтому достаточно просто вызвать login (), чтобы узнать, работает ли служба или нет (socket.error), и в то же время этот метод login () аутентифицирует пользователя, если службавверх