FastAPI でダウンロードするサイトを作る

(1)動的にダウンロードするコンテンツを作成してダウンロードさせる場合

例)CSVを生成→ダウンロード

from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/download")
def csvget():
    content = '"あ","い","う"\n"1","2","3"'
    filename = "data.csv"
    return Response(content=content.encode("utf-8-sig"),
                    headers={"Content-Disposition": f'attachement; filename={filename}'},
                    media_type="text/csv")

content.encode("utf-8-sig") とすることで、BOM付きのUTF-8 にしている。
SJIS エンコードにしたければ、content.encode("MS932") とする。

ダウンロードファイル名に2バイト文字を含む場合は、
urllib.parse quoteでURLエンコードが必要になる。

from urllib.parse import quote
return Response(content=content.encode("utf-8-sig"),
                headers={"Content-Disposition": f"attachement; filename*=UTF-8''{quote(filename)}"},
                media_type="text/csv")

(2)既に存在するファイルをダウンロードさせる場合
FileResponse を使用し、path とダウンロードファイル名を指定する。

from fastapi.responses import FileResponse
return FileResponse(path=file_path,
                    filename=f'{filename}'
                   )