1. ホーム
  2. python

Flaskフレームワークでサーバープッシュを実装する方法とは?

2023-12-04 07:55:05

質問

Flaskのマイクロウェブフレームワークでサーバープッシュ機能を使った小さなサイトを構築しようとしているのですが、直接連携するフレームワークがあるのか知りませんでした。

私が使用したのは Juggernaut とは相性が悪いようで redis-py とは連動しないようですし、Juggernautは最近非推奨になっています。

どなたか、私のケースについてご提案いただけないでしょうか?

どのように解決するのですか?

以下のサイトをご覧ください。 サーバーから送信されるイベント . Server-Sent Events は ブラウザの API で、サーバへのソケットを開いたまま、更新のストリームを購読することができます。 ストリームを受信することができます。詳細については、Alex MacCaw (著) を参照してください。 Juggernaut)の投稿をご覧ください。 なぜ彼はジャガーノートを殺すのか と、なぜよりシンプルな Server-Sent Events は、多くの場合、この仕事に適したツールであり、Websocket よりも優れている。 ウェブソケットよりも優れています。

プロトコルはとても簡単です。単に mimetype text/event-stream を追加するだけです。 を追加するだけです。ブラウザは接続を維持し、更新を待ちます。サーバーから送られるイベント は、サーバから送信された data: で始まり、次の改行がある行です。

data: this is a simple message
<blank line>

構造化されたデータを交換したい場合は、データをjsonとしてダンプし、jsonをワイヤで送信すればよい。

利点はFlaskでSSEを使えることです。 サーバーを追加することなく、FlaskでSSEを使えることです。単純な チャットアプリケーションの例 があります。 は、パブ/サブバックエンドとしてredisを使用しています。

def event_stream():
    pubsub = red.pubsub()
    pubsub.subscribe('chat')
    for message in pubsub.listen():
        print message
        yield 'data: %s\n\n' % message['data']


@app.route('/post', methods=['POST'])
def post():
    message = flask.request.form['message']
    user = flask.session.get('user', 'anonymous')
    now = datetime.datetime.now().replace(microsecond=0).time()
    red.publish('chat', u'[%s] %s: %s' % (now.isoformat(), user, message))


@app.route('/stream')
def stream():
    return flask.Response(event_stream(),
                          mimetype="text/event-stream")

サンプルアプリを実行するためにgunicronを使用する必要はありません。 を使用する必要はありません。アプリを実行するときにスレッドを使用することを確認してください。 そうでなければ、SSE 接続が開発サーバーをブロックしてしまうからです。

if __name__ == '__main__':
    app.debug = True
    app.run(threaded=True)

クライアント側では、新しいメッセージがサーバーからプッシュされたときに呼び出される、Javascriptのハンドラ関数が必要です。 がプッシュされたときに呼び出されます。

var source = new EventSource('/stream');
source.onmessage = function (event) {
     alert(event.data);
};

サーバー送信型イベントは 対応 をサポートしています。 Internet Explorer はまだ Server-Sent Events をサポートしていませんが、Version 10 でサポートされる予定です。 バージョン 10 でサポートされる予定です。古いブラウザをサポートするために、2つの推奨される Polyfill があります。