2013-08-22 24 views
9

也許這是Flask中的一個問題,在服務器端無法處理斷開連接事件。Python燒瓶,如何檢測SSE客戶端從前端斷開Javascript

在Response類中,有一個名爲「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控制器的類似問題。問題在於,框架似乎沒有檢測到連接關閉,直到它嘗試向客戶端發送事件。

一種方法是定期向客戶端發送「心跳」事件。我目前在我的Rails項目上以60秒的時間間隔成功使用了它。我有一個單獨的線程,可以將這些心跳「發射」到我的控制器已訂閱的Redis中。

線程方法的替代方法是將Redis pubsub塊用超時(例如60秒)包裝起來。然後將心跳事件發送到客戶端 - 之後是另一次pubsub呼叫。這種方法的缺點是,你可能會錯過一個事件,而你沒有訂閱。

這裏有更多關於穿線方法: Redis + ActionController::Live threads not dying

相關問題