我正在考慮使用SSE將新數據推送到客戶端,並使用Flot(javascript圖表庫)顯示「實時」更新。我的服務器上的蟒蛇瓶的框架中運行,我已經找到了如何將數據推送到客戶端,但只要我離開這個頁面出現問題: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 2013-05-29 00:52:51
在我看來,這是一個糟糕的解決方案。如果瀏覽器不執行它可能導致內存泄漏(意外崩潰,連接斷開等)。 – 2014-07-26 11:24:53
這就是爲什麼我注意到「你可能需要做更多的工作來處理像Chrome這樣的事情(這可能會也可能不會讓開發者觸發這類事件......) – bbenne10 2014-07-28 16:47:55