
比如我调用 api 执行一个任务,然后在任务中实时返回消息。类似下面这种逻辑
@app.get("/") async def root(): for i in range(10): time.sleep(1) yield str(i) 1 NickLuan 2024-04-11 19:48:52 +08:00 噗,还能这么写? |
2 street000 2024-04-11 19:52:20 +08:00 SSE 或 WebSocket |
3 chaunceywe 2024-04-11 19:57:51 +08:00 from fastapi import FastAPI from fastapi.responses import StreamingResponse app = FastAPI() async def fake_video_streamer(): for i in range(10): yield b"some fake video bytes" @app.get("/") async def main(): return StreamingResponse(fake_video_streamer()) |
6 reapear OP @chaunceywe 这个好像,会等待所有 yield 结果才一起返回。 |
7 mmdsun 2024-04-12 00:58:44 +08:00 via iPhone @app.route("/sse", methods=["GET"]) def write(): def generate(): s = "output it token by token test output it token by token test" for c in s: yield c time.sleep(0.02) return Response(stream_with_context(generate())) 用浏览器试试看,输出效果是逐字的。不是整个返回 |
8 TomCN 2024-04-12 09:18:17 +08:00 @reapear #6 如果你使用 postman 或者 swagger ,是会接收完成后显示的,你可以试着写一个 get 方法,浏览器直接访问接口,然后就会一部分一部分的显示出来了,前端页面接收的话,要使用 fetch 来请求 |
9 realJamespond 2024-04-12 14:51:48 +08:00 spring 可以用 defered response 配合长轮询 |