【Python】FastAPI ~ 基本編 ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2025/10/05/014051
https://dk521123.hatenablog.com/entry/2025/10/06/000101

を通して、FastAPIの基本的な知識やTipsを書き溜めておく。

目次

【1】自動生成されるAPIドキュメント
【2】REST / HTML の切替
【3】CORS(Cross-Origin Resource Sharing)の設定
 1)サンプル
 2)各パラメータについて

【1】自動生成されるAPIドキュメント

* 自動でAPIドキュメントが生成され、以下のURLから参照可能。
 => サーバが起動されているかの確認にも使える!

http://localhost:8000/docs

【2】REST / HTML の切替

* 詳細なサンプルは、以下の関連記事を参照。

FastAPI ~ ファイルアップロード ~
https://dk521123.hatenablog.com/entry/2025/10/06/000101

Case1:REST の場合

# 特に意識する必要がなく、ReturnはRESTのJSONを返すだけ
@app.post("/upload/")
async def upload_file(upload_file: UploadFile = File(...)):

    return {
        "status": "success",
        "filename": upload_file.filename,
        "file_type": file_type
    }

Case2:HTML の場合

from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

# ★「response_class=HTMLResponse」を追加する
@app.get("/", response_class=HTMLResponse)
async def upload_form(request: Request):
    return templates.TemplateResponse("upload_form.html", {"request": request})

【3】CORS(Cross-Origin Resource Sharing)の設定

* 異なるオリジン(ドメイン、プロトコル、ポート番号の組み合わせ)間での
 リソース共有を可能にする、ウェブブラウザのセキュリティ機能

1)サンプル

import os
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware


ENV = os.getenv("ENV", "development")

app = FastAPI()
if ENV == "production":
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["https://your-frontend.com"],
        allow_credentials=True,
        allow_methods=["GET", "POST"],
        allow_headers=["Content-Type", "Authorization"],
    )
else:
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["http://localhost:3000"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

2)各パラメータについて

* 適切な設定は、悪意のあるクロスサイトスクリプティング(XSS)などの対策になる
設定項目 開発用 本番用のポイント
allow_origins ["http://localhost:3000"] 本番ドメインを指定(*は避ける)
allow_credentials True(クッキー・認証情報を含む通信を許可) 必要なら True だが * と併用しない
allow_methods "*" 使うメソッドだけ(例: "GET", "POST")
allow_headers "*" "Content-Type" など必要最小限だけにすべき

関連記事

FastAPI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/10/05/014051
FastAPI ~ ファイルアップロード ~
https://dk521123.hatenablog.com/entry/2025/10/06/000101