mor*_*ras 5 python flask server-sent-events
我正在玩一个小项目,以更好地了解Web技术。一个要求是,如果多个客户端可以访问我的网站,而一个客户端进行更改,则应通知所有其他客户端。从我收集到的信息来看,“服务器已发送”事件似乎可以满足我的要求。但是,当我同时在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);
}
Run Code Online (Sandbox Code Playgroud)
服务器:
@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)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何将事件发送给所有连接的客户端,而不仅仅是一个?
以下是一些可能有帮助的要点(我一直想发布基于“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。
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |