Flask マイクロ Web フレームワークでサーバー プッシュ機能を備えた小さなサイトを構築しようとしていますが、直接操作できるフレームワークがあるかどうか知りませんでした。
Juggernautを使用しましたが、現在のバージョンのredis-pyでは動作しないようで、Juggernaut は最近廃止されました。
私の場合、誰か提案がありますか?
Flask マイクロ Web フレームワークでサーバー プッシュ機能を備えた小さなサイトを構築しようとしていますが、直接操作できるフレームワークがあるかどうか知りませんでした。
Juggernautを使用しましたが、現在のバージョンのredis-pyでは動作しないようで、Juggernaut は最近廃止されました。
私の場合、誰か提案がありますか?
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 つのポリフィルがあります。