服务器从Flask向多个客户端发送事件

时间:2013-01-05 17:08:28

标签: python flask server-sent-events

我正在玩一个小项目,以便更好地了解网络技术。 一个要求是,如果多个客户端可以访问我的站点,并且一个客户端进行更改,则应通知所有其他客户端。从我收集的服务器发送事件似乎做我想要的。 但是,当我在Firefox和Chrome中打开我的网站并尝试发送一个事件时,只有其中一个浏览器获得它。如果我再次发送一个事件,只有一个浏览器获得新事件,通常是没有获得第一个事件的浏览器。

以下是相关的代码段。

客户端:

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)

我的问题是,如何将事件发送给所有连接的客户端,而不仅仅是一个?

1 个答案:

答案 0 :(得分:0)

以下是一些可能有用的要点(我的意思是发布基于'django-sse'的'flask-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。