2013-08-22 13 views
9

多分これはフラスコ内の問題があるからSSEクライアントの切断を検出する方法を、サーバー側で断線イベントを処理する方法はありません。Pythonのフラスコは、フロントエンドのJavascript

レスポンスクラスには、 "call_on_close"という名前のメソッドがあります。このメソッドでは、引数なしの関数を追加できます。 on_close()、レスポンスオブジェクトのcloseメソッドが呼び出されたときに起動されますが、私はJavaScriptでクライアント側からEventSource.close()を呼び出すとき、これは起こりません。サーバー側で

コード:クライアント側で

from flask import Response 
r = Response(stream(), ...) 
r.call_on_close(on_close) 
return r 

def on_close(): 
    print "response is closed!" 

def stream(): 
    ... # subscribe to redis 
    for message in pubsub.listen(): 
    .... 
    yield 'data: %s\n\n' % message 

:SSEでページにアンロードハンドラを追加

$(window).unload(
    function() { 
    sse.close(); 
    } 
} 

何が間違っていますか?

コードによるご提案または解決方法はありがたいです!

ありがとうございます!

答えて

2

私はRails Live Controllersで同様の問題を抱えています。問題は、フレームワークが、イベントをクライアントに送信しようとするまで、接続が閉じられていることを検出していないように見えることです。

1つのアプローチは、定期的な "ハートビート"イベントをクライアントに送信することです。私は現在、Railsプロジェクトで60秒の間隔でこれをうまく使っています。私はコントローラが購読しているRedisにこれらのハートビートを「放出」する別のスレッドを持っています。

スレッドアプローチに代わるものは、タイムアウト付きのRedis pubsubにブロックをラップすることです(再び、60秒と言います)。その後、ハートビートイベントをクライアントに送信し、続いて別のpubsubコールを送信します。このアプローチの欠点は、あなたが購読していない間にイベントを逃すかもしれないということです。

スレッディングアプローチの詳細はこちら: Redis + ActionController::Live threads not dying

関連する問題