比如我调用 api 执行一个任务,然后在任务中实时返回消息。类似下面这种逻辑
@app.get("/")
async def root():
for i in range(10):
time.sleep(1)
yield str(i)
1
NickLuan 237 天前
噗,还能这么写?
|
2
street000 237 天前 3
SSE 或 WebSocket
|
3
chaunceywe 237 天前
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 237 天前 via iPhone 1
@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 237 天前 1
@reapear #6 如果你使用 postman 或者 swagger ,是会接收完成后显示的,你可以试着写一个 get 方法,浏览器直接访问接口,然后就会一部分一部分的显示出来了,前端页面接收的话,要使用 fetch 来请求
|
9
realJamespond 236 天前
spring 可以用 defered response 配合长轮询
|