5

私は、Webテクノロジーをよりよく理解するために、小さなプロジェクトで遊んでいます。1つの要件は、複数のクライアントが私のサイトにアクセスでき、1つが変更を加えた場合、他のすべてのクライアントに通知する必要があることです。私が収集したものから、サーバー送信イベントは私が望むことをしているようです。ただし、FirefoxとChromeの両方でサイトを開いてイベントを送信しようとすると、一方のブラウザーのみがイベントを取得します。イベントを再度送信すると、ブラウザの1つだけが新しいイベントを取得します。通常、イベント番号1を取得しなかったブラウザです。

関連するコードスニペットは次のとおりです。

クライアント:

console.log("setting sse handlers")
viewEventSource = new EventSource("{{ url_for('viewEventRequest') }}");
viewEventSource.onmessage = handleViewEvent;

function handleViewEvent(event){
    console.log("called handle view event")
    console.log(event);
}

サーバ:

@app.route('/3-3-3/view-event')
def view_event_request():
    return Response(handle_view_event(), mimetype='text/event-stream')

def handle_view_event():
while True:
    for message in pubsub_view.listen():
        if message['type'] == 'message':
            data = 'retry: 1\n'
            data += 'data: ' + message['data'] + '\n\n'
            return data

@app.route('/3-3-3/test')
def test():
    red.publish('view-event', "This is a test message")
    return make_response("success", 200)

私の質問は、イベントを1つだけでなく、接続されているすべてのクライアントに送信するにはどうすればよいですか?

4

1 に答える 1

1

ここに役立つかもしれないいくつかの要点があります(私は'django-sseに基づいて'flask-sse'のようなものをリリースすることを意味してきました):

https://gist.github.com/3680055

https://gist.github.com/3687523

また便利です-https://github.com/jkbr/chat/blob/master/app.py

あなたのコードについて私が最初に気付くのは、'handle_view_event'はジェネレーターではないということです。'while'ループ内にありますが、' return'を使用すると、最初にデータを返すときに常に関数が終了します。関数は1回しか戻ることができません。代わりに「利回り」にしたいと思います。

いずれにせよ、上記のリンクはあなたに実際のセットアップの例を与えるはずです。

Anarovが言うように、websocketsとsocket.ioもオプションですが、SSEはとにかく機能するはずです。wsが必要ない場合、socket.ioはSSEの使用をサポートしていると思います。

于 2013-01-06T16:15:43.473 に答える