StreamingResponse 是 FastAPI 中的一个类,用于处理流式响应。它允许你将数据以流的形式发送给客户端,适用于处理大文件、实时日志等场景。本文将介绍在 FastAPI 中如何使用 StreamingResponse 类,包括常见场景、实践案例以及在 IDE 编辑器(如:vscode)中运行的步骤。
常见应用场景
StreamingResponse
允许在响应期间逐块发送数据,而不是等到整个响应数据准备好后再发送。
通常情况下,当响应数据较大或需要在处理时逐步生成时,使用 StreamingResponse
可以提供更高效的响应处理和减少内存消耗。
使用 StreamingResponse
可以实现以下场景:
- 大型文件下载:当需要下载大型文件时,使用
StreamingResponse
可以逐块地将文件数据发送给客户端,减少内存占用。 - 实时数据流:当需要实时将数据流式传输到客户端时,如实时日志或事件流,使用
StreamingResponse
可以逐块地发送数据并保持长连接。
使用 StreamingResponse
首先,确保你已经安装了 FastAPI。你可以通过以下命令使用 pip 安装 FastAPI:
pip install fastapi
接下来,我们将创建一个简单的 FastAPI 应用程序,并使用 StreamingResponse 类返回一个流式响应。请在你的 IDE 编辑器中创建一个名为 fastapi-stream.py
的文件,并将以下代码粘贴到其中:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import io
app = FastAPI()
@app.get("/stream")
async def stream_response():
data = b"hello world\n" * 20000
stream = io.BytesIO(data)
return StreamingResponse(stream, media_type="text/plain")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)
在上面的代码中,通过使用 io.BytesIO
创建了一个字节流对象 stream
,并将其作为数据源传递给 StreamingResponse
对象。这个字节流对象 stream
包含了一个重复了 20000 次的 "hello world\n" 的字节数据。
通过返回 StreamingResponse(stream, media_type="text/plain")
,FastAPI 将会逐个读取字节流中的数据块并将其返回给客户端。
这里的关键是将字节流对象作为数据源传递给 StreamingResponse
。FastAPI 会从字节流中逐个读取数据块,并将每个数据块作为响应的一部分返回给客户端。客户端在接收到一个数据块后可以开始处理数据,而不需要等待整个响应的完成。
在这个示例中,FastAPI 会逐个读取字节流中的数据块(每个数据块是 "hello world\n"),然后将它们逐个返回给客户端。客户端在接收到每个数据块时可以立即处理数据,而不需要等待全部数据块的接收完成。
运行程序
要运行 FastAPI 应用程序,并测试 StreamingResponse 的功能,我们需要使用 uvicorn
这样的 ASGI 服务器。请确保你已经安装了 uvicorn
。你可以通过以下命令使用 pip 安装它:
pip install uvicorn
在你的 IDE 编辑器中,打开终端并导航到存储 fastapi-stream.py
文件的目录。然后运行以下命令启动应用程序:
uvicorn fastapi-stream:app --reload
现在,你可以使用 HTTP 请求工具(如 cURL、Apifox 或浏览器插件)向 http://localhost:8000/stream
发送 GET 请求。你将能够在响应中看到按一秒钟间隔生成的数据。
使用 Apifox 调试 FastAPI 接口
Apifox 是一个集 API 文档、API 调试、API Mock和API 自动化测试于一体的 API 协作平台,我们可以通过 Apifox 来更方便的调试 FastAPI。
如果想快速的调试一条接口,新建一个项目后,在项目中选择“调试模式”,填写请求地址后即可快速发送请求,并获得响应结果,上文的实践案例如图所示:
总结
本文介绍了在 FastAPI 中使用 StreamingResponse 类的方法,在实践案例中,我们展示了一个简单的示例,其中生成了一系列的数据并将其以流的形式返回。
StreamingResponse 类是 FastAPI 中处理流式响应的强大工具,适用于处理大文件、实时日志等需要流式传输的场景。同时,使用 Apifox 进行接口调试,大大提高了项目的开发效率,图形化的操作界面也更加方便。
知识扩展
了解更多有关 FastAPI 的知识:
参考链接:
- FastAPI 官网:https://fastapi.tiangolo.com/
- FastAPI StreamingResponse 文档:https://fastapi.tiangolo.com/advanced/custom-response/?h=#streamingresponse