Я пытаюсь прослушать очередь rabbitmq из обработчика событий flask-socketio, чтобы отправлять уведомления в реальном времени в веб-приложение. Моя установка на данный момент:
Сервер
import pika
import sys
from flask import Flask, request
from flask_socketio import SocketIO, emit, disconnect
app = Flask(__name__)
app.config['SECRET_KEY'] = 'not-so-secret'
socketio = SocketIO(app)
def is_authenticated():
return True
def rabbit_callback(ch, method, properties, body):
socketio.emit('connect', {'data': 'yes'})
print "body: ", body
@socketio.on('connect')
def connected():
emit('notification', {'data': 'Connected'})
creds = pika.PlainCredentials(
username="username",
password="password")
params = pika.ConnectionParameters(
host="localhost",
credentials=creds,
virtual_host="/")
connection = pika.BlockingConnection(params)
# This is one channel inside the connection
channel = connection.channel()
# Declare the exchange we're going to use
exchange_name = 'user'
channel.exchange_declare(exchange=exchange_name,
type='topic')
channel.queue_declare(queue='notifications')
channel.queue_bind(exchange='user',
queue='notifications',
routing_key='#')
channel.basic_consume(rabbit_callback,
queue='notifications',
no_ack=True)
channel.start_consuming()
if __name__ == '__main__':
socketio.run(app, port=8082)
Браузер
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':8082');
socket.on('connect', function(resp) {
console.log(resp);
});
socket.on('disconnect', function(resp) {
console.log(resp);
});
socket.on('error', function(resp) {
console.log(resp);
});
socket.on('notification', function(resp) {
console.log(resp);
});
</script>
Если я закомментирую строку «channel.start_using()» в нижней части кода сервера и загружу страницу браузера, я успешно подключусь к flask-socketio и увижу {данные: «Подключено»} в своей консоли.
Когда я раскомментирую строку, я не вижу {данные: "Подключено"} в своей консоли. Тем не менее, когда я отправляю сообщение в очередь уведомлений, срабатывает функция rabbit_callback. Я вижу свое сообщение, напечатанное на консоли сервера, но вызов emit не работает. Ошибок на сервере и в браузере нет. Любые советы очень ценятся.
Спасибо!