您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Flask框架中实现服务器推送?

如何在Flask框架中实现服务器推送?

查看服务器发送的事件。服务器发送的事件是一种浏览器API,通过它可以打开服务器套接字,订阅更新流。有关更多信息,请阅读Alex MacCaw(《剑圣》的作者)关于他为何杀死剑圣以及为什么在许多情况下更简单的“服务器发送事件”比Websockets更好的工作工具的文章

该协议非常简单。只需将mimetype添加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支持较旧的浏览器

Python 2022/1/1 18:18:19 有534人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶