看看
Server-Sent Events.服务器发送事件是一个
浏览器API,允许您保持打开服务器的套接字,订阅
更新流。更多信息阅读Alex MacCaw(作者
Juggernaut)post在
why he kills juggernaut和为什么更简单
服务器发送事件在manny情况下是更好的工具比工作
Websockets。
协议真的很容易。只需添加mimetype文本/事件流到您的
响应。浏览器将保持连接打开并监听更新。一个事件
从服务器发送的一行文本以data:开头和一个以下换行符。
data: this is a simple message
如果要交换结构化数据,只需将数据转储为json并通过线发送json。
一个优点是,您可以在Flask中使用SSE,而不需要额外的
服务器。在github上有一个简单的chat application example
使用redis作为pub / sub后端。
def event_stream():
pubsub = red.pubsub()
pubsub.subscribe('chat')
for message in pubsub.listen():
print message
yield 'data: %s\n\n' % message['data']
@app.route('/post', methods=['POST'])
def post():
message = flask.request.form['message']
user = flask.session.get('user', 'anonymous')
now = datetime.datetime.now().replace(microsecond=0).time()
red.publish('chat', u'[%s] %s: %s' % (now.isoformat(), user, message))
@app.route('/stream')
def stream():
return flask.Response(event_stream(),
mimetype="text/event-stream")
你不需要使用gunicron来运行
示例应用程序。只要确保在运行应用程序时使用线程,因为
否则SSE连接将阻止您的开发服务器:
if __name__ == '__main__':
app.debug = True
app.run(threaded=True)
在客户端,你只需要一个Javascript处理函数,当一个新的时将被调用
消息从服务器推送。
var source = new EventSource('/stream');
source.onmessage = function (event) {
alert(event.data);
};
服务器发送事件是最近的Firefox,Chrome和Safari浏览器的supported。
Internet Explorer尚不支持服务器发送事件,但预计会支持它们
版本10.有两个推荐的Polyfills支持旧的浏览器