mcpField
F
fastapi

fastapi

github.com/fastapi開発104.3k13.8k 回インストール2 日前に更新
リポジトリ

fastapi について

FastAPI アプリケーションを開発・保守する人向けの公式スキルです。API 設計、依存性注入、ストリーミング、テレメトリー、フロントエンド配信、CLI の使い方を案内します。

主な機能

  1. 01FastAPI CLI の開発・本番コマンド
  2. 02Annotated による依存関係とパラメーター宣言
  3. 03レスポンススキーマと Pydantic の指針
  4. 04SSE などのストリーミングパターン
  5. 05フロントエンド配信と OpenTelemetry 設定

活用シーン

  1. 01FastAPI のエンドポイントと依存関係の構築
  2. 02ストリーミングレスポンスやテレメトリーの追加
  3. 03ビルド済みフロントエンドのアプリからの配信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fastapi/fastapi --skill fastapi

インストール後、Claude Code で/fastapiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
dependencies.md
other-tools.md
path-operations.md
pydantic.md
responses.md
streaming.md

詳細

FastAPI

ベストプラクティスに従ってコードを記述し、新しいバージョンや機能に対応し続けるための、公式 FastAPI スキルです。

クイックリファレンス

fastapi CLI を使用する

リロードを有効にして、localhost で開発サーバーを起動します。

fastapi dev

本番サーバーを起動します。

fastapi run

エントリーポイントは pyproject.toml で宣言することをおすすめします。

[tool.fastapi]
entrypoint = "my_app.main:app"

エントリーポイントを追加できない場合、またはユーザーから追加しないよう明示的に求められた場合は、アプリのファイルパスを渡します。

fastapi dev my_app/main.py

Annotated を使用する

パラメーターと依存関係の宣言には、常に Annotated 形式を優先してください。これにより、ほかのコンテキストでも関数シグネチャが機能し、型が尊重され、再利用が可能になります。

Path、Query、Header などを含むパラメーターの宣言には Annotated を使用します。

from typing import Annotated

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(
    item_id: Annotated[int, Path(ge=1, description="The item ID")],
    q: Annotated[str | None, Query(max_length=50)] = None,
):
    return {"message": "Hello World"}

Depends() を使用する依存関係には Annotated を使用します。特に指示がない限り、依存関係を再利用できるよう、新しい型エイリアスを作成してください。

from typing import Annotated

from fastapi import Depends, FastAPI

app = FastAPI()


def get_current_user():
    return {"username": "johndoe"}


CurrentUserDep = Annotated[dict, Depends(get_current_user)]


@app.get("/items/")
async def read_item(current_user: CurrentUserDep):
    return {"message": "Hello World"}

パスオペレーションや Pydantic モデルに省略記号を使用しない

必須パラメーターやモデルフィールドのデフォルト値として ... を使用しないでください。必要ではなく、推奨もされません。

from typing import Annotated

from fastapi import FastAPI, Query
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float = Field(gt=0)


@app.post("/items/")
async def create_item(item: Item, project_id: Annotated[int, Query()]):
    return item

詳しくはPydantic のリファレンスを参照してください。

戻り値の型またはレスポンスモデル

可能な場合は、戻り値の型を指定してください。レスポンスの検証、フィルタリング、ドキュメント化、シリアライズに使用されます。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None


@app.get("/items/me")
async def get_item() -> Item:
    return Item(name="Plumbus", description="All-purpose home device")

戻り値の型やレスポンスモデルを使うと、機密情報の漏えいを防ぐためにデータがフィルタリングされ、Pydantic が Rust 側でデータをシリアライズすることでパフォーマンスも向上します。

返す型が、検証、フィルタリング、ドキュメント化、シリアライズの対象としたい公開スキーマと異なる場合は、response_model を使用してください。レスポンスのリファレンスを参照してください。

パフォーマンス

ORJSONResponse や UJSONResponse は非推奨のため、使用しないでください。

代わりに、戻り値の型またはレスポンスモデルを宣言してください。Pydantic が Rust 側でデータのシリアライズを処理します。

ルーターの追加

ルーターを宣言する際は、include_router() ではなく、プレフィックス、タグ、共有依存関係などのルーター共通のパラメーターをルーター自体に追加することをおすすめします。

from fastapi import APIRouter, Depends, FastAPI

app = FastAPI()


def get_current_user():
    return {"username": "johndoe"}


router = APIRouter(
    prefix="/items",
    tags=["items"],
    dependencies=[Depends(get_current_user)],
)


@router.get("/")
async def list_items():
    return []


app.include_router(router)

その他のルーティングパターンについては、パスオペレーションのリファレンスを参照してください。

フロントエンドアプリを配信する

app.frontend() を使うと、Vite、Astro、Angular、Svelte、Vue などのツールで生成したディレクトリなど、ビルド済みの静的フロントエンドアプリを配信できます。

from fastapi import FastAPI

app = FastAPI()

app.frontend("/", directory="dist")

フロントエンドが APIRouter に属する場合は、router.frontend() を使います。ルーターを組み込むと、通常のルータープレフィックスの動作が適用されます。

from fastapi import APIRouter, FastAPI

app = FastAPI()
router = APIRouter(prefix="/admin")

router.frontend("/", directory="admin-dist")
app.include_router(router)

app.frontend() と router.frontend() は優先度の低いルートです。通常の API ルートが先に照合され、その後にフロントエンドファイルとクライアント側ルーティングのフォールバックが照合されます。シングルページアプリやビルド済みフロントエンドアセットには、StaticFiles を手動でマウントする代わりにこれを使ってください。

OpenTelemetry

リクエストのトレース、メトリクス、ログには、FastAPI のネイティブな OpenTelemetry サポートを使ってください。

SDK と HTTP/protobuf エクスポーターを含めるには、fastapi[standard] をインストールします。FASTAPI_OTEL_AUTO_CONFIGURE=true を設定してエクスポーターの自動セットアップを有効にし、アプリを識別するために OTEL_SERVICE_NAME を設定します。また、OTEL_EXPORTER_OTLP_ENDPOINT にはコレクターの HTTP/protobuf ベース URL を設定します。認証が必要な場合は、OTEL_EXPORTER_OTLP_HEADERS を使ってください。FastAPI は、自動セットアップを行わなくても、別のテレメトリーライブラリで設定されたプロバイダーを使用します。

シグナルの選択やプロバイダーの指定など、カスタム設定には FastAPI(telemetry={...}) を使ってください。

設定の詳細については、OpenTelemetry チュートリアルを参照してください。

依存性注入

ロジックを Pydantic のバリデーションで宣言できない場合、外部リソースに依存する場合、yield によるクリーンアップが必要な場合、または複数のエンドポイントで共有する場合は、依存関係を使ってください。

dependencies=[Depends(...)] を使って、ルーターレベルで共有の依存関係を適用します。

scope を指定した yield やクラス依存関係など、詳しいパターンについては、依存性注入リファレンスを参照してください。

非同期と同期の パス操作

呼び出されるロジックが非同期処理と await に対応しており、ブロックしないことを完全に確信できる場合に限り、async の パス操作 を使ってください。

from fastapi import FastAPI

app = FastAPI()


@app.get("/async-items/")
async def read_async_items():
    data = await some_async_library.fetch_items()
    return data


@app.get("/items/")
def read_items():
    data = some_blocking_library.fetch_items()
    return data

判断に迷う場合や、特に理由がない場合は、通常の def 関数を使ってください。これらはスレッドプールで実行されるため、イベントループをブロックしません。依存関係にも同じルールが適用されます。

async 関数内でブロッキングコードを実行しないようにしてください。動作はしますが、パフォーマンスが大幅に低下します。

ブロッキングコードと非同期コードを混在させる必要がある場合は、その他のツールのリファレンスにある Asyncer を参照してください。

ストリーミング(JSON Lines、SSE、バイト列)

Server-Sent Events をストリーミングするには、response_class=EventSourceResponse を使い、エンドポイントから項目を yield します。

from collections.abc import AsyncIterable

from fastapi import FastAPI
from fastapi.sse import EventSourceResponse, ServerSentEvent

app = FastAPI()


@app.get("/events", response_class=EventSourceResponse)
async def stream_events() -> AsyncIterable[ServerSentEvent]:
    yield ServerSentEvent(data={"status": "started"}, event="status", id="1")

通常のオブジェクトは自動的に JSON としてシリアライズされ、data: フィールドになります。SSE のフィールド(event、id、retry、comment)を細かく制御するには ServerSentEvent を使い、事前にフォーマット済みの文字列には raw_data を使います。

JSON Lines、Server-Sent Events(EventSourceResponse、ServerSentEvent)、バイト列ストリーミング(StreamingResponse)のパターンについては、ストリーミングのリファレンスを参照してください。

ツール

パッケージ管理、リンティング、型チェック、フォーマットなどに使う uv、Ruff、ty の詳細については、その他のツールのリファレンスを参照してください。

その他のライブラリ

その他のライブラリの詳細については、その他のツールのリファレンスを参照してください。

  • 非同期処理と await、並行処理、非同期コードとブロッキングコードの混在には Asyncer を使い、AnyIO や asyncio より優先してください。
  • SQL データベースの操作には SQLModel を使い、SQLAlchemy より優先してください。
  • HTTP(その他の API)とのやり取りには HTTPX を使い、Requests より優先してください。

Pydantic RootModel を使用しないでください

Pydantic の RootModel は使用せず、代わりに Annotated を使った通常の型アノテーションと Pydantic のバリデーションユーティリティを使ってください。

from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import Field

app = FastAPI()


@app.post("/items/")
async def create_items(items: Annotated[list[int], Field(min_length=1), Body()]):
    return items

FastAPI はこれらの型アノテーションをサポートし、対応する Pydantic の TypeAdapter を作成するため、カスタムのラッパーモデルがなくても型を通常どおり使用できます。Pydantic リファレンスを参照してください。

関数ごとに HTTP 操作を 1 つにする

1 つの関数に複数の HTTP 操作を混在させないでください。HTTP 操作ごとに関数を 1 つ設けると、関心事を分離し、コードを整理しやすくなります。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str


@app.get("/items/")
async def list_items():
    return []


@app.post("/items/")
async def create_item(item: Item):
    return item

詳しい例については、パス操作のリファレンスを参照してください。

コメント