Python の FastAPI フレームワークで Web API を実装する

Python の FastAPI フレームワークを使うと、高性能な Web API を簡単に実装できます。

FastAPI で Hello World

まずは、FastAPI で Hello World を返す Web API を実装してみます。 ここでは、プロジェクトのパッケージ管理に uv を使います。 uv を使うと、仮想環境 (venv) を意識せずに済むのでとても楽です(参考: uv の基本)。

プロジェクトの作成と FastAPI のインストール(ライブラリ&CLIツール)
$ uv init hello-api
$ cd hello-api
$ uv add fastapi --extra standard

uv add fastapi するときに --extra standard オプションを指定すると、API サーバーを立ち上げるための fastapi コマンドfastapi-cliuvicorn パッケージ)なども一緒にインストールされます。 従来の pip でインストールするなら、pip install fastapi[standard] とします。

uv run 経由で fastapi コマンドが実行できるか確認しておきます。

fastapi コマンドのバージョン確認
$ uv run fastapi --version
FastAPI CLI version: 0.0.7

Web API 実装として、以下のようなファイルを作成します。

main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

FastAPI サーバーを立ち上げるには、次のように fastapi dev コマンド、あるいは fastapi run コマンドを使用します。 開発時は前者のコマンドを使って、development モードで立ち上げます。

FastAPI サーバーの立ち上げ
$ uv run fastapi dev main.py  # development モードで起動
$ uv run fastapi run main.py  # production モードで起動

これで、下記のようなアドレスにアクセスすることで、API のレスポンスとして JSON データを取得できます。

  • http://127.0.0.1:8000/
  • http://127.0.0.1:8000/items/123
  • http://127.0.0.1:8000/items/123?q=hello

さらに、Web ブラウザで http://127.0.0.1:8000/docs にアクセスすると、自動生成された API ドキュメント (Swagger UI) を参照できます。 FastAPI サーバーを development モードで立ち上げている場合は、ソースコードの更新時に自動的にリロードしてくれます。

Docker コンテナとして起動できるようにする

Web API サーバーをデプロイするときは、Docker コンテナとして起動できるようにしておくと便利です。 下記は uv で管理されている FastAPI アプリケーションの Docker イメージを作成するための Dockerfile です。

Dockerfile
FROM python:3-slim-bullseye

# Install uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv

# Copy the application into the container
COPY . /app

# Install the application dependencies
WORKDIR /app
RUN uv sync --frozen --no-cache

# Run the application
CMD ["/app/.venv/bin/fastapi", "run", "main.py", "--port", "8080"]

Dockerfile を用意できたら、次のようにビルドして hello-api イメージを作成します。

コンテナイメージのビルド
$ docker image build -t hello-api .

次のようにコンテナを起動すると、http://127.0.0.1:8080/ で Web API にアクセスできるようになります。

コンテナの起動
$ docker container run --rm -p 8080:8080 hello-api

イメージサイズは 300MB 弱ですが、必要なくなったら削除しておきます。

コンテナイメージの削除
$ docker image rm hello-api