SSEを使用してクライアントに新しいデータをプッシュし、Flot(javascript charting library)の "live"アップデートを表示することを考えています。私のサーバーは、Pythonのフラスコフレームワーク上で動作し、私はクライアントにデータをプッシュする方法を考え出してきたが、問題は、すぐに私がページを離れると発生します。Flaskサーバーがイベントソケット例外を送信しました
Exception happened during processing of request from ('127.0.0.1', 38814)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 582, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/lib/python2.7/SocketServer.py", line 640, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 693, in finish
self.wfile.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
エラーが発生した理由を私は理解して - ソケットがあります無限ループが「ライブ」データを扱うために決して閉じられませんでした。問題は、ページの変更を検出してソケットをきれいに閉じる方法です。クライアント側で接続を閉じることはできますか?ページの変更を検出するにはどうすればよいですか?
これは、サーバーのコードスケルトンで、私はもちろん、ディスプレイにオブジェクトのリストを含むJSONでテキストメッセージを交換します:
def event_stream():
import time
while True:
time.sleep(1)
yield "data: This is a message number X.\n\n"
@app.route('/stream')
def stream():
return Response(event_stream(), mimetype="text/event-stream")
これは私が最終的に来た解決策でした。あなたの答えに感謝します。 – NindzAI
これは私の意見では悪い解決策です。ブラウザが実行しないとメモリリークが発生する可能性があります(予期せずクラッシュする、接続が切断されるなど)。 –
私は「あなたはChromeのようなものでもっとやるべきことがいくつかあるかもしれない」と指摘しています(これは開発者がこれらの種のイベントを発生させるかもしれません...) – bbenne10