这个问题与我们如何处理Python xmlrpclib Connection Refused有关?
当我尝试使用以下代码时,我的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"
Run Code Online (Sandbox Code Playgroud)
这是问题:
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'>
Run Code Online (Sandbox Code Playgroud)
好吧,我只是在寻找它; 我的旧方法很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)
Run Code Online (Sandbox Code Playgroud)
总结一下,我们有3个案例:
XML-RPC服务器是它,我们定义了一个名为方法_() :
(
编辑:我选择的名称_,因为它不太可能有这个名字的方法,但这种情况还是会发生)
在这种情况下也不例外会抓并且代码将执行return True
XmlRPC服务器已启动并且在其中我们没有任何方法methoded call _():
这个时间xmlrpclib.Fault将被提升,我们也将传递给return True
XmlRPC服务器已关闭:
现在socket.error异常将被引发,当我们调用时a._(),我们应该这样做return False
我不知道是否有一种简单的方法可以做到这一点,我很乐意看到它,直到那时,希望这次能解决问题:)
注意:当你做if a:python时会再次搜索一个__nonzero__()测试布尔值的方法a,这将失败.
NB 2:有些xmlrpc服务提供了专门用于认证的rpc路径,在这个路径中提供了像login()...这样的服务提供方法,这种方法在我们的例子中可以替换_()方法,所以只需要调用login (),足以知道服务是up还是down(socket.error),同时这个login()方法在服务启动时验证用户.
| 归档时间: |
|
| 查看次数: |
5477 次 |
| 最近记录: |