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

标签 python flask server-sent-events

我正在玩一个小项目以更好地了解网络技术。 一个要求是,如果多个客户可以访问我的站点,并且其中一个进行了更改,则应通知所有其他客户。从我收集到的 Server Sent 事件来看,似乎在做我想做的事。 但是,当我在 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)

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

最佳答案

以下是一些可能有帮助的要点(我一直想发布基于“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”总是会在我们第一次返回数据时退出函数;一个函数只能返回一次。我认为您希望它是“yield”。

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

正如 Anarov 所说,websockets 和 socket.io 也是一种选择,但 SSE 应该可以正常工作。如果不需要 ws,我认为 socket.io 支持使用 SSE。

关于python - 服务器从 Flask 向多个客户端发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174191/

相关文章:

python - Heroku Flask 应用程序中的 Celery/CloudAMQP 错误

python - 我无法导入模块,我不知道为什么 Python : ImportError: Cannot import name X

python - 在 Flask/Python 中创建 Enum 常量

javascript - 更改服务器发送事件的源(url)

python - 从 Python 执行 ffmpeg

python - Discord Bot 返回 "HTTPException: BAD REQUEST (status code: 400): Cannot send an empty message"尽管我发送的是非空消息

kotlin - Ktor sse 客户端断开连接

javascript - 使用 SSE 获取 mysql select 的响应

python - 高级 Pandas : Create Multi-Index panda dataframe from certain row indices

python局部变量奇怪的行为