Python の FastAPI フレームワークを使うと、高性能な Web API を簡単に実装できます。
FastAPI で Hello World
まずは、FastAPI で Hello World を返す Web API を実装してみます。
ここでは、プロジェクトのパッケージ管理に uv
を使います。
uv
を使うと、仮想環境 (venv) を意識せずに済むのでとても楽です(参考: uv の基本)。
$ uv init hello-api
$ cd hello-api
$ uv add fastapi --extra standard
uv add fastapi
するときに --extra standard
オプションを指定すると、API サーバーを立ち上げるための fastapi
コマンド(fastapi-cli
、uvicorn
パッケージ)なども一緒にインストールされます。
従来の pip
でインストールするなら、pip install fastapi[standard]
とします。
uv run
経由で fastapi
コマンドが実行できるか確認しておきます。
$ uv run fastapi --version
FastAPI CLI version: 0.0.7
Web API 実装として、以下のようなファイルを作成します。
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 モードで立ち上げます。
$ 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
です。
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