使用Python Flask每秒向API发随机数据仅返回最后数组的问题
问题原因
你的Flask路由函数会完整执行完整个循环后才返回最终结果,客户端只能等到所有循环结束才能拿到数据,所以看不到每秒更新的效果。要实现实时推送数据,需要用Flask的流式响应(Streaming Responses),让服务器逐步向客户端发送数据,而不是一次性返回。
解决方案
使用生成器函数配合Flask的Response对象,设置合适的响应头,让客户端保持连接并持续接收每秒更新的数据。
修改后的代码
import time import random from flask import Flask, Response, jsonify app = Flask(__name__) @app.route('/') def index(): def generate_data(): mylist = [] for i in range(0, 61): x = random.randint(1, 100) mylist.append(x) if len(mylist) == 11: mylist.pop(0) # 将当前列表转为JSON字符串,按SSE格式输出 yield f"data: {jsonify(mylist).data.decode('utf-8')}\n\n" time.sleep(1) # 指定响应类型为事件流,维持长连接 return Response(generate_data(), content_type='text/event-stream') if __name__ == "__main__": app.run(debug=True)
关键说明
- 生成器函数:
generate_data作为生成器,每次yield都会向客户端发送当前的列表数据,无需等待循环结束。 - 响应头设置:
content_type='text/event-stream'告诉客户端这是流式事件流,会保持连接持续接收数据。 - 数据格式:用
data:前缀包裹JSON字符串,是Server-Sent Events(SSE)的标准格式,客户端可以轻松解析。
客户端实时展示示例(JavaScript)
如果要在网页上实时显示数据,可以用这段代码:
<!DOCTYPE html> <html> <body> <div id="data-display"></div> <script> const source = new EventSource('/'); source.onmessage = function(event) { const latestData = JSON.parse(event.data); document.getElementById('data-display').textContent = JSON.stringify(latestData); }; </script> </body> </html>
内容的提问来源于stack exchange,提问作者MJay
相关产品推荐
相关产品推荐

