函数计算,python环境flask框架,返回text/event-stream流数据的时候总是把所有chunk合在一起返回,而不是逐chunk返回,与真实环境不符。请问有办法解决吗?浏览器请求该接口,真实环境会逐字打印到浏览器页面,而函数计算FC会下载一个文件
为了解决这个问题,您可以尝试使用以下两种方法:
禁用 Flask 框架的响应缓存:可以通过设置 Cache-Control 头信息来禁用 Flask 框架的响应缓存,从而实现逐 chunk 返回的效果。例如,您可以在返回响应时添加以下头信息:
python
Copy
from flask import Response
@app.route('/stream')
def stream():
def generate():
yield "data: chunk1\n\n"
yield "data: chunk2\n\n"
yield "data: chunk3\n\n"
return Response(generate(), mimetype='text/event-stream', headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'})
使用其他框架:如果您不想禁用 Flask 框架的响应缓存,可以尝试使用其他框架来实现逐 chunk 返回的效果。例如,您可以使用 Tornado 框架来实现 text/event-stream 流数据的返回,Tornado 框架天生支持流式响应,可以实现逐 chunk 返回的效果。
python
Copy
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.set_header('Content-Type', 'text/event-stream')
self.set_header('Cache-Control', 'no-cache')
self.write('data: chunk1\n\n')
self.flush()
tornado.ioloop.IOLoop.current().add_timeout(2, self.chunk2)
def chunk2(self):
self.write('data: chunk2\n\n')
self.flush()
tornado.ioloop.IOLoop.current().add_timeout(2, self.chunk3)
def chunk3(self):
self.write('data: chunk3\n\n')
self.flush()
self.finish()
def make_app():
return tornado.web.Application([
(r"/stream", MainHandler),
])
if name == "main":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
你可以尝试使用flask.Response
对象的stream_with_context
方法来逐块返回数据。示例:
from flask import Flask, Response, stream_with_context
import time
app = Flask(__name__)
def generate_data():
for i in range(10):
yield f"data: {i}
"
time.sleep(1)
@app.route('/stream')
def stream():
return Response(stream_with_context(generate_data()), content_type='text/event-stream')
if __name__ == '__main__':
app.run(debug=True)
这个示例中,generate_data
函数会生成一个包含10个数字的数据流,每个数字之间间隔1秒。通过使用stream_with_context
,我们可以确保在计算环境中逐块返回数据。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。