73

Flask マイクロ Web フレームワークでサーバー プッシュ機能を備えた小さなサイトを構築しようとしていますが、直接操作できるフレームワークがあるかどうか知りませんでした。

Juggernautを使用しましたが、現在のバージョンのredis-pyでは動作しないようで、Juggernaut は最近廃止されました。

私の場合、誰か提案がありますか?

4

4 に答える 4

121

Server-Sent Events をご覧ください。Server-Sent Events は、サーバーへのソケットを開いたままにし、更新のストリームをサブスクライブできるブラウザー API です。詳細については、Alex MacCaw (Juggernaut の作成者) の投稿を参照してください。彼がなぜ juggernaut を殺すのか、また、より単純な Server-Sent Events が多くの場合 Websockets よりも優れたツールである理由について説明しています。

プロトコルは本当に簡単です。text/event-stream応答に MIME タイプを追加するだけです。ブラウザーは接続を開いたままにして、更新をリッスンします。サーバーから送信されるイベントは、 で始まるテキスト行とdata:それに続く改行です。

data: this is a simple message
<blank line>

構造化データを交換したい場合は、データを json としてダンプし、json をネットワーク経由で送信するだけです。

利点は、追加のサーバーを必要とせずに Flask で SSE を使用できることです。redis を pub/sub バックエンドとして使用する簡単なチャット アプリケーションの例が github にあります。

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);
};

Server-Sent Events は、最近の Firefox、Chrome、および Safari ブラウザでサポートされています。Internet Explorer はまだ Server-Sent Events をサポートしていませんが、バージョン 10 でサポートされる予定です。古いブラウザーをサポートするために推奨される 2 つのポリフィルがあります。

于 2012-09-02T12:40:08.013 に答える