affaan-m/ECC

fastapi-patterns

非同期API、依存性注入、Pydanticのリクエスト・レスポンスモデル、OpenAPIドキュメント、テスト、セキュリティ、本番対応のためのFastAPIパターン。

78CollectingNetwork access
See how to use itView GitHub source
npx skills add https://github.com/affaan-m/ECC --skill "docs/ja-JP/skills/fastapi-patterns"
Automated source guide

Source checked Jul 28, 2026·Refresh due Oct 26, 2026

Reorganized from the pinned upstream SKILL.md

Turn fastapi-patterns's source instructions into a guide you can follow

According to the pinned SKILL.md from affaan-m/ECC: 本番指向のFastAPIサービスのためのパターン。

npx skills add https://github.com/affaan-m/ECC --skill "docs/ja-JP/skills/fastapi-patterns"
Check the pinned source

Best fit

  • 非同期API、依存性注入、Pydanticのリクエスト・レスポンスモデル、OpenAPIドキュメント、テスト、セキュリティ、本番対応のためのFastAPIパターン。

Bring this context

  • A concrete task that matches the documented purpose of fastapi-patterns.
  • The files, examples, or context the task depends on.
  • Your constraints, target environment, and definition of done.

Expected outputs

  • A result that follows the pinned fastapi-patterns instructions.
  • A concise record of assumptions, inputs used, and unresolved questions.
  • A final check against the source workflow and relevant permission signals.

Key source sections

Read fastapi-patterns through these 5 source sections

Sections are extracted automatically from the pinned SKILL.md and link back to the source.

01

使用するタイミング

FastAPIアプリを構築またはレビューする場合。

SKILL.md · 使用するタイミング
FastAPIアプリを構築またはレビューする場合。ルーター、スキーマ、依存関係、データベースアクセスを分割する場合。データベースや外部サービスを呼び出す非同期エンドポイントを記述する場合。
02

仕組み

FastAPIアプリを明示的な依存関係とサービスコードの上の薄いHTTPレイヤーとして扱います:

SKILL.md · 仕組み
main.py はアプリ構築、ミドルウェア、例外ハンドラー、ルーター登録を担当する。schemas/ はPydanticのリクエストとレスポンスモデルを担当する。dependencies.py はデータベース、認証、ページネーション、リクエストスコープの依存関係を担当する。
03

プロジェクトレイアウト

Review the “プロジェクトレイアウト” section in the pinned source before continuing.

SKILL.md · プロジェクトレイアウト
Review and apply the “プロジェクトレイアウト” source section.
04

アプリケーションファクトリー

テストとワーカーが制御された設定でアプリをビルドできるように、ファクトリーを使用します。

SKILL.md · アプリケーションファクトリー
テストとワーカーが制御された設定でアプリをビルドできるように、ファクトリーを使用します。allowcredentials=Trueと一緒にalloworigins=[""]を使用しないでください; ブラウザはその組み合わせを拒否し、Starletteは認証情報付きリクエストに対してそれを禁止します。
05

Pydanticスキーマ

リクエスト、更新、レスポンスのモデルを分離します。

SKILL.md · Pydanticスキーマ
リクエスト、更新、レスポンスのモデルを分離します。レスポンスモデルにはパスワードハッシュ、アクセストークン、リフレッシュトークン、内部認可状態を含めてはなりません。

SkillSignal prompt templates

Provide the task, context, and acceptance criteria

These prompts were written by SkillSignal from the source structure; they are not upstream text.

Task-start prompt

Confirm source fit, inputs, and outputs before acting.

Use fastapi-patterns to help me with: [specific task]. Context: [files, data, or background]. Constraints: [environment, scope, and prohibited actions]. Before acting, check the pinned SKILL.md and explain which sections apply, what inputs are still missing, and what you will deliver.

Source-guided execution

Make the Agent explicitly follow the key extracted sections.

Apply the pinned fastapi-patterns source to [task]. Pay particular attention to these source sections: “使用するタイミング”, “仕組み”, “プロジェクトレイアウト”, “アプリケーションファクトリー”, “Pydanticスキーマ”. Preserve the important decision at each step. Mark facts not covered by the source as “needs confirmation” instead of inventing them. Then verify the result against my acceptance criteria: [criteria].

Result-review prompt

Check omissions, permissions, and source drift before delivery.

Review the current fastapi-patterns result: (1) does it satisfy the original task; (2) were any applicable steps or limits in the pinned SKILL.md missed; (3) did it perform any unauthorized file, command, network, or data action; and (4) which conclusions remain unverified? List issues first, then fix only what the source or user authorization supports.

Output checklist

Verify each item before delivery

The task matches the purpose documented in the SKILL.md.

The source section “使用するタイミング” has been checked.

The source section “仕組み” has been checked.

The source section “プロジェクトレイアウト” has been checked.

The source section “アプリケーションファクトリー” has been checked.

Inputs, constraints, and acceptance criteria are explicit.

Unverified facts, compatibility, and outcome claims are clearly marked.

Any file, command, network, or data action has been reviewed.

Choose a different workflow

When another Skill is the better fit

FAQ

What does fastapi-patterns do?

本番指向のFastAPIサービスのためのパターン。

How do I start using fastapi-patterns?

The catalog detected this source-specific install command: npx skills add https://github.com/affaan-m/ECC --skill "docs/ja-JP/skills/fastapi-patterns". Inspect the command and pinned source before running it.

Which Agent platforms does it declare?

No dedicated Agent platform is declared in the pinned source record.

Repository stars
234,327
Repository forks
35,711
Quality
78/100
Source repository last pushed

Quality breakdown

Based on traceable docs and repository signals; stars are not treated as quality.

78/100
Documentation23/30
Specificity14/25
Maintenance20/20
Trust signals21/25

Compare before choosing

Related Agent Skills and source variants

These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.

View original Skill.mdThis page is parsed directly from the repository SKILL.md without editorial rewriting. Collected: Jul 28, 2026 · about 1 min

FastAPIパターン

本番指向のFastAPIサービスのためのパターン。

使用するタイミング

  • FastAPIアプリを構築またはレビューする場合。
  • ルーター、スキーマ、依存関係、データベースアクセスを分割する場合。
  • データベースや外部サービスを呼び出す非同期エンドポイントを記述する場合。
  • 認証、認可、OpenAPIドキュメント、テスト、またはデプロイ設定を追加する場合。
  • FastAPI PRをコピー可能な例とリスクについて確認する場合。

仕組み

FastAPIアプリを明示的な依存関係とサービスコードの上の薄いHTTPレイヤーとして扱います:

  • main.py はアプリ構築、ミドルウェア、例外ハンドラー、ルーター登録を担当する。
  • schemas/ はPydanticのリクエストとレスポンスモデルを担当する。
  • dependencies.py はデータベース、認証、ページネーション、リクエストスコープの依存関係を担当する。
  • services/ または crud/ はビジネスと永続化操作を担当する。
  • tests/ は本番リソースを開かずに依存関係をオーバーライドする。

小さなルーターと明示的なresponse_model宣言を優先します。レスポンススキーマには生のORMオブジェクト、シークレット、フレームワークのグローバル変数を含めないでください。

プロジェクトレイアウト

app/
|-- main.py
|-- config.py
|-- dependencies.py
|-- exceptions.py
|-- api/
|   `-- routes/
|       |-- users.py
|       `-- health.py
|-- core/
|   |-- security.py
|   `-- middleware.py
|-- db/
|   |-- session.py
|   `-- crud.py
|-- models/
|-- schemas/
`-- tests/

アプリケーションファクトリー

テストとワーカーが制御された設定でアプリをビルドできるように、ファクトリーを使用します。

from contextlib import asynccontextmanager

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

from app.api.routes import health, users
from app.config import settings
from app.db.session import close_db, init_db
from app.exceptions import register_exception_handlers


@asynccontextmanager
async def lifespan(app: FastAPI):
    await init_db()
    yield
    await close_db()


def create_app() -> FastAPI:
    app = FastAPI(
        title=settings.api_title,
        version=settings.api_version,
        lifespan=lifespan,
    )

    app.add_middleware(
        CORSMiddleware,
        allow_origins=settings.cors_origins,
        allow_credentials=bool(settings.cors_origins),
        allow_methods=["GET", "POST", "PUT", "PATCH", "DELETE"],
        allow_headers=["Authorization", "Content-Type"],
    )

    register_exception_handlers(app)
    app.include_router(health.router, prefix="/health", tags=["health"])
    app.include_router(users.router, prefix="/api/v1/users", tags=["users"])
    return app


app = create_app()

allow_credentials=Trueと一緒にallow_origins=["*"]を使用しないでください; ブラウザはその組み合わせを拒否し、Starletteは認証情報付きリクエストに対してそれを禁止します。

Pydanticスキーマ

リクエスト、更新、レスポンスのモデルを分離します。

from datetime import datetime
from typing import Annotated
from uuid import UUID

from pydantic import BaseModel, ConfigDict, EmailStr, Field


class UserBase(BaseModel):
    email: EmailStr
    full_name: Annotated[str, Field(min_length=1, max_length=100)]


class UserCreate(UserBase):
    password: Annotated[str, Field(min_length=12, max_length=128)]


class UserUpdate(BaseModel):
    email: EmailStr | None = None
    full_name: Annotated[str | None, Field(min_length=1, max_length=100)] = None


class UserResponse(UserBase):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    created_at: datetime
    updated_at: datetime

レスポンスモデルにはパスワードハッシュ、アクセストークン、リフレッシュトークン、内部認可状態を含めてはなりません。

依存関係

リクエストスコープのリソースには依存性注入を使用します。

from collections.abc import AsyncIterator
from uuid import UUID

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.ext.asyncio import AsyncSession

from app.core.security import decode_token
from app.db.session import session_factory
from app.models.user import User


oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login")


async def get_db() -> AsyncIterator[AsyncSession]:
    async with session_factory() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise


async def get_current_user(
    token: str = Depends(oauth2_scheme),
    db: AsyncSession = Depends(get_db),
) -> User:
    payload = decode_token(token)
    user_id = UUID(payload["sub"])
    user = await db.get(User, user_id)
    if user is None:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")
    return user

ルートハンドラー内でインラインにセッション、クライアント、または認証情報を作成しないでください。

非同期エンドポイント

I/Oを実行する場合はルートハンドラーを非同期にし、その内部で非同期ライブラリを使用します。

from fastapi import APIRouter, Depends, Query
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.dependencies import get_current_user, get_db
from app.models.user import User
from app.schemas.user import UserResponse


router = APIRouter()


@router.get("/", response_model=list[UserResponse])
async def list_users(
    limit: int = Query(default=50, ge=1, le=100),
    offset: int = Query(default=0, ge=0),
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    result = await db.execute(
        select(User).order_by(User.created_at.desc()).limit(limit).offset(offset)
    )
    return result.scalars().all()

非同期ハンドラーからの外部HTTP呼び出しにはhttpx.AsyncClientを使用してください。非同期ルートでrequestsを呼び出さないでください。

エラー処理

ドメイン例外を一元化し、レスポンスの形状を安定させます。

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse


class ApiError(Exception):
    def __init__(self, status_code: int, code: str, message: str):
        self.status_code = status_code
        self.code = code
        self.message = message


def register_exception_handlers(app: FastAPI) -> None:
    @app.exception_handler(ApiError)
    async def api_error_handler(request: Request, exc: ApiError):
        return JSONResponse(
            status_code=exc.status_code,
            content={"error": {"code": exc.code, "message": exc.message}},
        )

OpenAPIカスタマイズ

カスタムOpenAPI呼び出し可能オブジェクトをapp.openapiに割り当ててください; 関数を一度だけ呼び出さないでください。

from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi


def install_openapi(app: FastAPI) -> None:
    def custom_openapi():
        if app.openapi_schema:
            return app.openapi_schema
        app.openapi_schema = get_openapi(
            title="Service API",
            version="1.0.0",
            routes=app.routes,
        )
        return app.openapi_schema

    app.openapi = custom_openapi

テスト

ルートハンドラーが決して参照しない内部ヘルパーではなく、Dependsで使用される依存関係をオーバーライドします。

import pytest
from httpx import ASGITransport, AsyncClient
from sqlalchemy.ext.asyncio import AsyncSession

from app.dependencies import get_db
from app.main import create_app


@pytest.fixture
async def client(test_session: AsyncSession):
    app = create_app()

    async def override_get_db():
        yield test_session

    app.dependency_overrides[get_db] = override_get_db
    async with AsyncClient(
        transport=ASGITransport(app=app),
        base_url="http://test",
    ) as test_client:
        yield test_client
    app.dependency_overrides.clear()

セキュリティチェックリスト

  • argon2-cffibcrypt、または現在のpasslib互換ハッシャーでパスワードをハッシュする。
  • JWTの発行者、オーディエンス、有効期限、署名アルゴリズムを検証する。
  • CORSオリジンを環境固有に保つ。
  • 認証と書き込み負荷の高いエンドポイントにレート制限を設ける。
  • すべてのリクエストボディにPydanticモデルを使用する。
  • ORMパラメーターバインディングまたはSQLAlchemy Coreの式を使用する; f文字列でSQLを構築しない。
  • ログからトークン、認可ヘッダー、クッキー、パスワードを削除する。
  • CIで依存関係の監査ツールを実行する。

パフォーマンスチェックリスト

  • データベース接続プールを明示的に設定する。
  • リストエンドポイントにページネーションを追加する。
  • N+1クエリに注意し、イーガーローディングを意図的に使用する。
  • 非同期パスでは非同期HTTP/データベースクライアントを使用する。
  • ペイロードサイズとCPUのトレードオフを確認してから圧縮を追加する。
  • 明示的な無効化の後ろで安定した高コストの読み取りをキャッシュする。

使用例

これらの例はプロジェクト全体のテンプレートではなく、パターンとして使用してください:

  • アプリケーションファクトリー: create_appでミドルウェアとルーターを一度設定する。
  • スキーマの分割: UserCreateUserUpdateUserResponseはそれぞれ異なる責務を持つ。
  • 依存関係のオーバーライド: テストはget_dbを直接オーバーライドする。
  • OpenAPIのカスタマイズ: app.openapi = custom_openapiを割り当てる。

関連情報

  • エージェント: fastapi-reviewer
  • コマンド: /fastapi-review
  • スキル: python-patterns
  • スキル: python-testing
  • スキル: api-design
Source repo
affaan-m/ECC
Skill path
docs/ja-JP/skills/fastapi-patterns/SKILL.md
Commit SHA
4e973d3eaf92
Repository license
MIT
Data collected