サーバー送信イベントをご覧ください。 Server-Sent Eventsは、更新のストリームをサブスクライブして、サーバーへのソケットを開いたままにしておくことができるブラウザーAPIです。詳細については、Alex MacCaw(Juggernautの作者)の投稿を読んでください。彼がjuggernautを殺す理由と、多くの場合、WebsocketsよりもsimplerServer-SentEventsの方が優れたツールです。
プロトコルは本当に簡単です。 mimetype text/event-stream
を追加するだけです あなたの応答に。ブラウザは接続を開いたままにし、更新をリッスンします。サーバーからのEventsentは、data:
で始まるテキスト行です。 および次の改行。
data: this is a simple message
<blank line>
構造化データを交換する場合は、データをjsonとしてダンプし、jsonをネットワーク経由で送信します。
利点は、extraServerを必要とせずにFlaskでSSEを使用できることです。 githubには、redisをpub/subバックエンドとして使用する簡単なチャットアプリケーションの例があります。
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);
};
サーバー送信イベントは、最近のFirefox、Chrome、Safariブラウザでサポートされています。InternetExplorerはサーバー送信イベントをまだサポートしていませんが、バージョン10でサポートされる予定です。古いブラウザをサポートするために推奨される2つのポリフィルがあります
- EventSource.js
- jquery.eventsource