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