我正在尝试使用Flask微网络框架上的服务器推送功能构建一个小型站点,但是我不知道是否有可以直接使用的框架。
我使用了Juggernaut,但在当前版本中似乎无法与redis-py一起使用,并且最近不推荐使用Juggernaut。
有人对我的案子有建议吗?
该协议非常简单。只需将mimetype添加text/event-stream到你的响应中即可。浏览器将保持连接打开并监听更新。从服务器发送的事件是一行文本,其开头是一个data:换行符。
text/event-stream
data:
data: this is a simple message <blank line>
如果要交换结构化数据,只需将数据作为json转储并通过网络发送json。
优点是你可以在Flask中使用SSE,而无需额外的服务器。github上有一个简单的聊天应用程序示例,该示例使用redis作为发布/订阅后端。
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)
在客户端,你只需要一个Java处理程序函数,当从服务器中推送新消息时将调用该函数。
var source = new EventSource('/stream'); source.onmessage = function (event) { alert(event.data); };
最近的Firefox,Chrome和Safari浏览器支持服务器发送事件。Internet Explorer尚不支持服务器发送的事件,但预期在版本10中将支持它们。建议使用两种Polyfills支持较旧的浏览器