2013-01-05 122 views
4

我正在玩一個小型項目,以更好地理解Web技術。 一個要求是,如果多個客戶端有權訪問我的網站,並且有一個進行了更改,則應通知所有其他客戶。從我收集的服務器發送的事件似乎做我想要的。 但是,當我在Firefox和Chrome中打開我的網站並嘗試發送事件時,只有其中一個瀏覽器可以獲取它。如果我再次發送一個事件,則只有其中一個瀏覽器獲得新事件,通常是沒有獲得第一個事件的瀏覽器。服務器從Flask發送事件給多個客戶端

這裏是相關的代碼片段。

客戶:

console.log("setting sse handlers") 
viewEventSource = new EventSource("{{ url_for('viewEventRequest') }}"); 
viewEventSource.onmessage = handleViewEvent; 

function handleViewEvent(event){ 
    console.log("called handle view event") 
    console.log(event); 
} 

服務器:

@app.route('/3-3-3/view-event') 
def view_event_request(): 
    return Response(handle_view_event(), mimetype='text/event-stream') 

def handle_view_event(): 
while True: 
    for message in pubsub_view.listen(): 
     if message['type'] == 'message': 
      data = 'retry: 1\n' 
      data += 'data: ' + message['data'] + '\n\n' 
      return data 

@app.route('/3-3-3/test') 
def test(): 
    red.publish('view-event', "This is a test message") 
    return make_response("success", 200) 

我的問題是,我如何才能將事件發送到所有連接的客戶端,而不是隻有一個?

+0

我不熟悉服務器發送的事件,所以我不知道這裏的問題,但我建議研究其他解決方案,如WebSockets和socket.io,看看他們是否更適合你的情況。 – Anorov

回答

0

這裏有一些學家可以幫助(我一直想推出類似基於「Django的SSE '瓶-SSE'):

https://gist.github.com/3680055

https://gist.github.com/3687523

也有用 - https://github.com/jkbr/chat/blob/master/app.py

我注意到你的代碼的第一件事是'handle_view_event'不是一個生成器。 儘管它處於'while'循環中,但在第一次返回數據時,'return'的使用將始終退出函數;一個函數只能返回一次。我認爲你希望它是'收益'。

在任何情況下,上述鏈接應該給你一個工作設置的例子。

正如Anarov所說,websockets和socket.io也是一種選擇,但SSE無論如何應該工作。我認爲如果不需要ws,socket.io支持使用SSE。

+0

感謝您的答案,但是我已經有SSE工作我的問題是,如果我發送一個事件不是所有的客戶端都會得到它。 同樣的情況發生在你的代碼中,如果我在兩個瀏覽器中運行它,其中一個不會加載,如果我使用'run(threaded = True)',那麼它會,但瀏覽器不會得到相同的值。 我懷疑這可能是由於服務器運行多個線程。 – morras

+0

請嘗試https://github.com/Chris2048/flask-sse中的測試示例 – Chris2048

+0

如果連接了多個值,這些值仍然只顯示在其中一個選項卡或瀏覽器中。 但是我改變了對服務器的要求,所以不再需要推送通知。 謝謝你的回答。 – morras

相關問題