Как Python может определить, что мой пароль RabbitMQ не удалось?

Я пытаюсь написать приложение 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?

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

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


person Brandon Rhodes    schedule 07.05.2011    source источник


Ответы (2)


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

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

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

person Rob Cowie    schedule 09.05.2011
comment
Я нигде не вижу, чтобы это исключение возникло, поэтому поймать его, очевидно, проблематично - было бы здорово, если бы вы нашли способ побудить библиотеку поделиться со мной исключением, а не скрывать его - я, по крайней мере, рад знать что он существует! - person Brandon Rhodes; 09.05.2011

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

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

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

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

person Michael Dillon    schedule 12.05.2011