2011-01-17 2 views
4

Этот вопрос связан с How do we handle Python xmlrpclib Connection Refused?Безопасный способ подключения к RPC серверу

Когда я пытаюсь использовать следующий код, с моей RPC сервер вниз, _get_rpc() возвращает значение False, и я хорошо идти. Однако, если сервер работает, он не работает с неизвестным методом. Он пытается выполнить .connect() на удаленном сервере? Как я могу обойти это, когда мне нужно было использовать .connect(), чтобы определить, работал ли возвращенный прокси (см. Соответствующий вопрос)?

import xmlrpclib 
import socket 

def _get_rpc(): 
    try: 
     a = xmlrpclib.ServerProxy('http://dd:[email protected]: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" 

Вот вопрос:

[email protected]:~/code/dd$ python xmlrpctest2.py 
Failed to connect 
[email protected]:~/code/dd$ supervisord -c ~/.supervisor # start up RPC server 
[email protected]:~/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

Ну я просто искал в него; мой старый метод сосать, потому что xmlrpclib.ServerProxy попытайтесь подключиться к серверу XmlRPC, когда вы вызываете метод, а не раньше !!!

Попробуйте вместо этого:

import xmlrpclib 
import socket 

def _get_rpc(): 
    a = xmlrpclib.ServerProxy('http://dd:[email protected]: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 сервер запущен и в нем мы определили метод, называемый _():
    (EDIT: я выбрал имя _, потому что он вряд ли будет иметь метод с этим именем, но этот случай все еще может произойти)
    В этом случае исключения не будет ловить, и код будет выполняться XmlRpc сервер return True

  2. вверх и в нем у нас нет какого-либо метода methoded вызова _():
    На этот раз xmlrpclib.Fault будет поднят и мы также передать на сервер XmlRpc return True

  3. вниз:
    Теперь socket.error Exce ption будет поднят и , когда мы называем a._() поэтому мы должны return False

Я не знаю, если есть простой способ сделать это, и я буду любить, чтобы увидеть его до тех пор, надеюсь, что это можно исправить вещь на этот раз :)

NB: когда вы if a: питона снова искать способ __nonzero__(), чтобы проверить логическое значение a, и это будет не в состоянии.

NB 2: Некоторые службы xmlrpc предлагают путь rpc, специализированный для аутентификации, на этом пути предлагаются методы предоставления услуг, такие как login() ..., этот метод может заменить метод _() в нашем случае, поэтому просто вызвать login() будет достаточно, чтобы узнать, вверх или вниз служба (socket.error), и в то же время этот метод login() аутентифицирует пользователя, если служба включена.

+0

Спасибо, это работает хорошо. Код просто нуждается в обновлении с другим оператором except для первой попытки, чтобы избежать повышения исключения отступа, но в противном случае работает. И спасибо за N.B # 2, я проверю, поддерживает ли супервизор это. –

+0

@ Энтони Хискокс: исправь это спасибо за замечание, и рад, что это поможет :) – mouad

+0

отличная экономия времени; xmlrpclib должен обрабатывать это – n611x007

Смежные вопросы