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(): # (1)
with open(some_file_path, mode="rb") as file_like: # (2)
yield from file_like # (3)

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