StreamingResponse
先看案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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())
|
该方法在返回过程当时会将数据以流的形式进行返回,官方对此描述:采用异步生成器或普通生成器/迭代器,然后流式传输响应主体。在作用与文件返回的时候可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from fastapi import FastAPI from fastapi.responses import StreamingResponse
some_file_path = "large-video-file.mp4" app = FastAPI()
@app.get("/") def main(): def iterfile(): with open(some_file_path, mode="rb") as file_like: yield from file_like
return StreamingResponse(iterfile(), media_type="video/mp4")
|
FileResponse
与其他响应类型相比,接受不同的参数集进行实例化:
- path - 要流式传输的文件的文件路径。
- headers - 任何自定义响应头,传入字典类型。
- media_type - 给出媒体类型的字符串。如果未设置,则文件名或路径将用于推断媒体类型。
- filename - 如果给出,它将包含在响应的 Content-Disposition 中。
文件响应将包含适当的 Content-Length,Last-Modified 和 ETag 的响应头。 使用案例如下:
1 2 3 4 5 6 7 8 9 10
| from fastapi import FastAPI from fastapi.responses import FileResponse
some_file_path = "large-video-file.mp4" app = FastAPI()
@app.get("/") async def main(): return FileResponse(some_file_path)
|
区别
两种都是文件传输的一种方式,但是相对于FileResponse,如果面临文件较大的话不推荐使用,虽然该方法可以增加文件大小的容量,但是大文件传输与返回更推荐使用StreamingResponse