我正在做一个小项目,以更好地理解web技术。一个要求是,如果多个客户访问我的网站,其中一个进行了更改,所有其他人都应该得到通知。从我收集的信息来看,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)我的问题是,如何将事件发送到所有连接的客户端,而不只是一个?
发布于 2013-01-07 00:15:43
这里有一些可能会有帮助的指南(我一直打算发布一些类似于'flask-sse‘的东西,基于’django-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”的使用总是会在我们第一次返回数据时退出函数;一个函数只能返回一次。我认为你希望它是“让步”。
在任何情况下,上面的链接都应该为您提供一个工作设置的示例。
正如阿纳罗夫所说,websockets和socket.io也是一种选择,但SSE无论如何都应该可以工作。我认为如果不需要ws,socket.io支持使用SSE。
https://stackoverflow.com/questions/14174191
复制相似问题