Как Python может обнаружить, что мой пароль RabbitMQ не удался? - PullRequest
0 голосов
/ 07 мая 2011

Я пытаюсь написать приложение на Python, которое использует RabbitMQ с помощью библиотеки Pika . Я использую последнюю версию, 0.9.5. Моя проблема в том, что мой код Python не может определить, когда его имя пользователя и пароль RabbitMQ неверны, потому что я не могу понять, как зарегистрировать обратный вызов Pika, который бы сообщал мне об ошибке. Мой код устанавливает соединение так:

import pika

class MyClient(object):
    def __init__(self, host, username, password):
        self.host = host
        self.username = username
        self.password = password
        self.connection = None

    def connect(self):
        credentials = pika.PlainCredentials(self.username, self.password)
        parameters = pika.ConnectionParameters(
            host=self.host, credentials=credentials, heartbeat=True,
            )
        self.connection = pika.SelectConnection(
            parameters, self.on_connected,
            )
        self.connection.add_on_close_callback(self.on_close)
        self.connection.ioloop.start()

    def on_connected(self, *args, **kw):
        print 'I am connected!', args, kw

    def on_close(self, *args, **kw):
        print 'I am closed!', args, kw

my_client = MyClient('...', '...', '...')
my_client.connect()

# (Good, I remembered to remove the username and password
#  before pasting to Stack Overflow!)

Если я запускаю этот сценарий, то ioloop запускается чуть более трех секунд, а затем программа завершается. Я не могу понять, как зарегистрировать обратный вызов или даже просто проверить состояние разорванного соединения, чтобы определить, произошла ли ошибка, или выяснить, в частности, что это ошибка неверного пароля. Я что-то упустил в документации Пики?

Может ли кто-нибудь помочь мне понять, как должна работать обработка ошибок Pika 0.9.5? Или 0.9.5 - это своего рода ужасный эксперимент, которого мне следует избегать, используя вместо этого более раннюю версию Pika, теперь, когда я заметил это электронное письмо , которое, кажется, указывает на то, что эта новая линия разработки стала тупик?

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Если вы хотите выполнить AMQP с Python, вам потребуется копия исходного кода вашей библиотеки, доступная для поиска и просмотра. Вы не можете добиться успеха с этими библиотеками, просто используя документацию API.

В этом случае я предполагаю, что вы не получите трассировку, потому что исключения где-то перехватываются и игнорируются. В противном случае вы увидите исключение, которое должно быть перехвачено в нижней части трассировки. Помните, исключения являются объектами, и некоторые библиотеки используют имена, такие как socket.error вместо TypeError или IOError.

Возможно, вам придется искать код, ища все операторы except и добавить к ним вызов log.debug ().

И если вы исправите код pika, обязательно отправьте патч.

1 голос
/ 09 мая 2011

Изначально я думал, что pika.exceptions.LoginError поднимается, если не удается войти в систему.Однако он возникает только в том случае, если предоставленный тип аутентификации не поддерживается брокером AMQP. не возникает при неудачной аутентификации.

После некоторого взлома источника Pika (печать внутренних кадров) кажется, что после отправки клиентом Connection.StartOK (включаяучетные данные), если они не приняты, ответ не получен.Если они приняты , то следующий полученный кадр будет Connection.Tune.

Я не уверен, каков ответ.Попробуйте использовать учетные данные «guest: guest» по умолчанию.Если они терпят неудачу, возможно, у вас другая проблема.Ваш фрагмент кода работает для меня с именем пользователя по умолчанию: пароль.

...