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

Python 服务器已从Flask向多个客户端发送事件,python,flask,server-sent-events,Python,Flask,Server Sent Events,我正在玩一个小项目,以便更好地了解web技术。 一个要求是,如果有多个客户端访问我的站点,并且其中一个客户端进行了更改,则应通知所有其他客户端。从我收集的信息来看,服务器发送的事件似乎符合我的要求。 然而,当我在Firefox和Chrome中打开我的站点并尝试发送事件时,只有一个浏览器收到它。如果我再次发送事件,则只有一个浏览器获得新事件,通常是未获得事件编号1的浏览器 下面是相关的代码片段 客户: console.log("setting sse handlers") viewEventSou

我正在玩一个小项目,以便更好地了解web技术。 一个要求是,如果有多个客户端访问我的站点,并且其中一个客户端进行了更改,则应通知所有其他客户端。从我收集的信息来看,服务器发送的事件似乎符合我的要求。 然而,当我在Firefox和Chrome中打开我的站点并尝试发送事件时,只有一个浏览器收到它。如果我再次发送事件,则只有一个浏览器获得新事件,通常是未获得事件编号1的浏览器

下面是相关的代码片段

客户:

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)

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

以下是一些可能会有所帮助的GIST(我一直想发布类似于基于“django sse”的“flask sse”的内容):

也有用-

关于代码,我注意到的第一件事是“handle\u view\u event”不是生成器。 尽管它处于“while”循环中,“return”的使用总是在我们第一次返回数据时退出函数;一个函数只能返回一次。我想你希望它是“收益率”

在任何情况下,以上链接都应该为您提供一个工作设置的示例


正如阿纳罗夫所说,websockets和socket.io也是一种选择,但SSE无论如何都应该起作用。我认为,如果不需要ws,socket.io支持使用SSE。

我不熟悉服务器发送的事件,因此我不知道这里的问题,但我建议研究其他解决方案,如WebSocket和socket.io,看看它们是否更适合您的情况。WebSocket在客户端和服务器之间使用全双工通信。但问题只是将一些事件发送到多个客户端。所以,阿诺洛夫,你的建议是不合适的。谢谢你的回答,但是我已经有SSE在工作了。我的问题是,如果我发送一个活动,并不是所有的客户都会得到它。您的代码也会发生同样的情况,如果我在两个浏览器中运行它,其中一个不会加载,如果我使用
run(threaded=True)
则会加载,但浏览器不会获得相同的值。我怀疑这可能是由于服务器运行多个线程造成的。如果连接了多个线程,这些值仍然只显示在其中一个选项卡或浏览器中。但是,我已经更改了服务器的要求,因此它不再需要推送通知。谢谢你的回答,即使是gevent和gunicorn?奇怪,我不知道为什么。谢谢。这也不适用于我,我有同样的问题。我有同样的问题,我的事件流从烧瓶只显示在一个标签在铬。我使用了
threaded=True
,但不起作用。你们找到根本原因了吗?怎么解决?