SSE(Server-Sent Events) 是一种基于 HTTP 的服务端推送技术,它允许客户端通过一个长连接接收服务器端的数据流。它特别适合数据不需要时时刻刻保持同步,又不想使用 WebSocket 的场景。本文介绍如何使用 Flask 框架实现 SSE 服务端推送。
SSE 原理
SSE 基于传统的 HTTP 协议,使用的是长连接,也就是说客户端和服务器端连接后,不会主动断开,直到:
- 服务器端关闭连接
- 客户端关闭连接
- 网络异常导致连接断开
在 SSE 中,客户端通过 EventSource
对象向服务器发送请求,服务器端在收到请求后,保持连接打开,并将数据逐个发送给客户端。
所有数据都是以文本格式发送,并且按照一定格式组织。其中最重要的是 event
、data
,如下:
event: message data: {"msg":"hello"} event: name data: "world"
其中,event
表示事件名,data
表示事件数据,在客户端接收到数据后,根据事件名做出相应反应。
Flask-SSE
Flask-SSE 是一个 Flask 扩展,它封装了 SSE 的 API,使得我们可以更方便地使用 SSE 服务端推送。
安装 Flask-SSE:
pip install Flask-SSE
在 Flask 应用程序中,我们需要创建 SSE 类的实例,并定义 SSE 端点函数,按照指定格式返回数据即可。
示例代码如下:
// javascriptcn.com 代码示例 from flask import Flask, render_template from flask_sse import sse app = Flask(__name__) app.register_blueprint(sse, url_prefix='/stream') @app.route('/') def index(): return render_template('index.html') @app.route('/send') def send(): data = 'hello, world' sse.publish({"message": data}, type='data') return "message sent"
在这个例子中,/stream
是 SSE 推送的 URL 地址,sse.publish
是 SSE 实例的方法,用于向客户端发送数据。
SSE 端点函数
SSE 端点函数将返回一个响应(SSEResponse 对象),响应中包含了一个 SSE 的数据格式,它是一个生成器函数,逐个返回需要发送给客户端的数据。
示例代码如下:
// javascriptcn.com 代码示例 from flask_sse import sse @app.route('/stream') def stream(): def generate(): for i in range(10): yield sse.event('message', {'data': 'hello, world %d' % i}) return sse.Response(generate(), headers={'X-Accel-Buffering': 'no', 'Cache-Control': 'no-cache'})
在这个例子中,我们使用生成器函数不断产生需要发送给客户端的数据,然后通过 SSEResponse 对象将生成器函数返回给客户端。需要注意的是,在 SSE 响应中必须在头部加上如上说明的头信息,否则有可能导致客户端不能正确接收到数据。
客户端实现
在客户端,我们需要创建一个 EventSource 对象,然后订阅服务器端推送的数据流,代码如下:
var source = new EventSource('/stream'); source.onmessage = function(event) { console.log('message: ', event.data); };
在这个例子中,我们首先创建了一个 EventSource 对象,然后通过 onmessage
事件来订阅服务器端推送的数据流。在实际使用中,根据 event.name
做出相应的反应即可。
总结
SSE 是一种基于 HTTP 的服务端推送技术,它与 WebSocket 不同,它没有实现双向通信,但它更加轻量级,适合数据不需要时时刻刻保持同步的场景。本文介绍了如何使用 Flask-SSE 实现 SSE 服务端推送,并给出了完整的示例代码,希望对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652e1b7d7d4982a6ebf2a6eb