fastapi について
fastapiは、FastAPIでAPIを開発する人向けのリファレンススキルです。ルート、依存性注入、検証、非同期処理、本番運用の例とトラブルシューティングを扱います。
主な機能
- 01ルートとレスポンスモデルのパターン
- 02依存性注入の例
- 03Pydanticによる検証の指針
- 04非同期開発の推奨事項
- 05本番運用準備とトラブルシューティング
活用シーン
- 01FastAPIのルートとレスポンスの構成
- 02検証と依存性注入の追加
- 03APIの本番運用準備の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill fastapiインストール後、Claude Code で/fastapiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
advanced.mdquick-ref/dependencies.mdpydantic.md詳細
FastAPI コアナレッジ
完全なリファレンス:接続管理、認証、ルーム管理、Pydantic メッセージプロトコル、ハートビート、Redis pub/sub によるスケーリング、バックグラウンドタスクなど、WebSocket 統合については advanced.md を参照してください。
詳細なナレッジ:包括的なドキュメントについては、technology に
fastapiを指定してmcp__documentation__fetch_docsを使用してください。
基本設定
from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, EmailStr
app = FastAPI(title="My API")
class UserCreate(BaseModel):
name: str
email: EmailStr
class User(UserCreate):
id: int
class Config:
from_attributes = True
ルートのパターン
@app.get("/users", response_model=list[User])
async def get_users(skip: int = 0, limit: int = 100):
return await db.users.find_many(skip=skip, limit=limit)
@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int):
user = await db.users.find(user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user
@app.post("/users", response_model=User, status_code=201)
async def create_user(user: UserCreate):
return await db.users.create(user.model_dump())
依存性注入
async def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = await verify_token(token)
if not user:
raise HTTPException(status_code=401, detail="Invalid token")
return user
@app.get("/me", response_model=User)
async def get_me(user: User = Depends(get_current_user)):
return user
主な機能
/docsに OpenAPI/Swagger ドキュメントを自動生成- Pydantic によるバリデーション
- 非同期処理をサポート
- あらゆる箇所で型ヒントを使用
このスキルを使用しないケース
- Django プロジェクト - Django には独自の ORM、管理画面、テンプレートがあります
- Flask マイクロサービス - Flask は型バリデーションのオーバーヘッドがなく、より軽量です
- 同期型 WSGI アプリ - FastAPI は非同期処理を優先します
- レガシーな Python 2.x - FastAPI には Python 3.7 以降が必要です
- REST 以外の API - 専用の GraphQL または gRPC フレームワークを使用してください
アンチパターン
| アンチパターン | 問題点 | 解決策 |
|---|---|---|
async def ではなく def を使う | イベントループをブロックします | I/O 操作には async def を使用してください |
response_model を指定しない | 出力が検証されません | 必ず response_model を指定してください |
| 同期型のデータベース呼び出し | ワーカーをブロックします | 非同期ドライバー(asyncpg、motor)を使用してください |
| ロックなしでグローバル状態を使う | 競合状態が発生します | asyncio.Lock または Depends() を使用してください |
| HTTPException を使わずに例外を送出する | 汎用的な 500 エラーが発生します | ステータスコードを指定して HTTPException を使用してください |
| 入力を検証しない | セキュリティ上の脆弱性につながります | バリデーター付きの Pydantic モデルを使用してください |
トラブルシューティング(クイックガイド)
| 問題 | 診断 | 対処法 |
|---|---|---|
| "RuntimeError: no running event loop" | 同期コードから非同期処理を呼び出しています | await または asyncio.run() を使用してください |
| バリデーションエラーが分かりにくい | フィールドの説明がありません | Field(description=...) を追加してください |
| 応答時間が遅い | 同期型のデータベース呼び出しが原因です | 非同期 SQLAlchemy に切り替えてください |
| ブラウザーで CORS エラーが発生する | ミドルウェアがありません | CORSMiddleware を追加してください |
| 依存関係が注入されない | インポートまたは構文が間違っています | Depends() の構文を確認してください |
本番環境への対応
セキュリティ設定
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter
app = FastAPI(
title="My API",
docs_url="/docs" if os.getenv("ENV") != "production" else None,
)
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_middleware(
CORSMiddleware,
allow_origins=os.getenv("ALLOWED_ORIGINS", "").split(","),
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH"],
allow_headers=["*"],
)
ヘルスチェック
@app.get("/health")
async def health():
return {"status": "healthy"}
@app.get("/ready")
async def readiness(db: Session = Depends(get_db)):
try:
db.execute("SELECT 1")
return {"status": "ready", "database": "connected"}
except Exception:
return JSONResponse(status_code=503, content={"status": "not ready"})
グレースフルシャットダウン
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan(app: FastAPI):
await database.connect()
yield
await database.disconnect()
app = FastAPI(lifespan=lifespan)
モニタリング指標
| 指標 | アラートしきい値 |
|---|---|
| リクエストレイテンシ p99 | > 500ms |
| エラー率(5xx) | > 1% |
| メモリ使用率 | > 80% |
| ワーカー使用率 | > 90% |
チェックリスト
- CORS が適切に設定されている
- レート制限が有効になっている
- セキュリティヘッダー用ミドルウェアがある
- すべての入力に Pydantic バリデーションを適用している
- ヘルス/レディネス/ライブネスのエンドポイントがある
- 構造化ログ(JSON 形式)を使用している
- グローバル例外ハンドラーがある
- シークレットを環境変数で管理している
- 本番環境ではドキュメントを無効にしている
- 複数のワーカーで Gunicorn を使用している
- グレースフルシャットダウンを処理している
リファレンスドキュメント
コメント
Markdown 対応