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

问题描述 投票:5回答:1

我正在玩一个小项目,以便更好地了解网络技术。一个需求是,如果多个客户端访问我的网站,其中一个客户端做了改变,所有其他客户端都应该得到通知。然而,当我在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)

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

python flask server-sent-events
1个回答
1
投票

以下是一些可能会有帮助的gist(我一直想在 "django-sse "的基础上发布类似 "flask-sse "的东西)。

https:/gist.github.com3680055

https:/gist.github.com3687523。

也是有用的 - https:/github.comjkbrchatblobmasterapp.py

我注意到你的代码的第一件事是'handle_view_event'不是一个生成器,虽然它是在'while'循环中,但使用'return'总是在我们第一次返回数据时退出函数,一个函数只能返回一次。我想你是想用'yield'来代替。

无论如何,上面的链接应该能给你一个工作设置的例子。

正如Anarov所说,websockets和socket.io也是一个选项,但SSE应该还是可以的。我认为,如果不需要ws,socket.io也支持使用SSE。

© www.soinside.com 2019 - 2024. All rights reserved.