Безопасный способ подключения к серверу RPC
Вопрос
Этот вопрос связан с Как мы обрабатываем Python xmlrpclclib Connection отказано?
Когда я пытаюсь использовать следующий код, с моим сервером 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, специализированный для выполнения аутентификации, в этом пути в нашем случае методы предложения услуг, такие как Login () ..., этот вид метода может заменить метод _ (), так что просто вызывает вход в систему (), будет достаточно, чтобы узнать, будет ли служба вверх или вниз (Socket.Error), и в то же время этот метод Login () аутентифицирует пользователя, если служба выросла.