首页 > 解决方案 > FastAPI,返回带有 sql 查询输出的 File 响应

问题描述

我正在使用 FastAPI,目前我返回了一个 csv,它是从带有 pandas 的 SQL 服务器读取的。(pd.read_sql()) 但是 csv 对于浏览器来说非常大,我想用文件响应返回它: https ://fastapi.tiangolo.com/advanced/custom-response/(页面末尾)。如果不先将其写入一个 csv 文件,我似乎无法做到这一点,这似乎很慢,并且会在每个请求上用 csv 混淆文件系统。

所以我的问题是,有没有办法从 sql 数据库或 pandas 数据框中返回 FileResponse。

如果没有,有没有办法在客户端读取完生成的 csv 文件后删除它?

谢谢你的帮助!

亲切的问候,

斯蒂芬

标签: pythonapifastapistarlette

解决方案


基于此https://github.com/tiangolo/fastapi/issues/1277

  1. 将您的数据框转换为流
  2. 使用流式响应
  3. 修改标题,使其成为下载(可选)
    from fastapi.responses import StreamingResponse
    import io
    
    @app.get("/get_csv")
    async def get_csv():
    
       df = pandas.DataFrame(dict(col1 = 1, col2 = 2))
    
       stream = io.StringIO()
    
       df.to_csv(stream, index = False)
    
       response = StreamingResponse(iter([stream.getvalue()]),
                            media_type="text/csv"
       )
    
       response.headers["Content-Disposition"] = "attachment; filename=export.csv"

       return response

推荐阅读