3

リアルタイム通知を Web アプリに送信できるように、flask-socketio イベント ハンドラー内から rabbitmq キューをリッスンしようとしています。これまでの私のセットアップ:

サーバ

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 に正常に接続され、コンソールに {data: "Connected"} と表示されます。

行のコメントを外すと、コンソールに {data: "Connected"} が表示されません。それにもかかわらず、通知キューにメッセージを送信すると、rabbit_callback 関数が起動します。メッセージがサーバー コンソールに表示されますが、出力呼び出しが機能していないようです。サーバーまたはブラウザにエラーはありません。どんなアドバイスでも大歓迎です。

ありがとう!

4

1 に答える 1