PluginBench
Skill
Pass
Audit score 90

fastapi-templates

wshobson/agents

Production-ready FastAPI project templates with async patterns, dependency injection, and error handling.

What is fastapi-templates?

Provides structured FastAPI project templates with async/await patterns, built-in dependency injection, and best practices for building high-performance APIs. Use when starting new FastAPI applications or setting up backend services with proper architecture.

  • Generates organized project structure with separated concerns (api, models, schemas, services, repositories)
  • Implements FastAPI dependency injection for database sessions, authentication, and business logic
  • Supports async/await patterns throughout route handlers, database operations, and middleware
  • Includes testing setup with pytest, AsyncClient, and in-memory SQLite for async tests
  • Provides configuration management and security patterns for production deployments
  • Handles middleware and error handling patterns for robust API applications

How to install fastapi-templates

npx skills add https://github.com/wshobson/agents --skill fastapi-templates
Prerequisites
  • FastAPI installed
  • SQLAlchemy with async support (sqlalchemy[asyncio])
  • pytest and pytest-asyncio for testing
  • httpx for async HTTP client testing
Claude Code
Cursor
Windsurf
Cline

How to use fastapi-templates

  1. 1.Install the skill using the provided command
  2. 2.Review the recommended project structure in app/ directory
  3. 3.Set up core configuration in core/config.py and core/database.py
  4. 4.Create database models in models/ and Pydantic schemas in schemas/
  5. 5.Implement business logic in services/ and data access in repositories/
  6. 6.Define API routes in api/v1/endpoints/ using FastAPI's Depends for dependency injection
  7. 7.Create test fixtures in tests/conftest.py and write async tests using pytest.mark.asyncio
  8. 8.Run tests with pytest to verify async database operations and API endpoints

Use cases

Good for
  • Starting a new REST API project from scratch with proper layered architecture
  • Building async microservices that connect to PostgreSQL or MongoDB databases
  • Creating high-performance web services with dependency injection and testable code
  • Setting up API projects with comprehensive test coverage using pytest and AsyncClient
  • Implementing versioned API endpoints (v1, v2) with shared dependencies and middleware
Who it's for
  • Backend developers building FastAPI applications
  • Python developers creating async REST APIs and microservices
  • Teams establishing standardized project structure and best practices
  • Developers needing production-ready templates with testing infrastructure

fastapi-templates FAQ

How do I set up database sessions with dependency injection?

Use FastAPI's Depends() to inject get_db() function into route handlers. Create an AsyncSessionLocal factory from SQLAlchemy's sessionmaker with AsyncSession class, then yield sessions in get_db() for proper cleanup.

How should I structure async database queries?

Place database queries in repository classes that use async SQLAlchemy operations. Call these from service classes, which are injected into route handlers via Depends(). This separates data access from business logic.

How do I test async routes with a test database?

Create pytest fixtures that override get_db dependency with an in-memory SQLite session. Use AsyncClient from httpx to make async requests to the test app, and mark tests with @pytest.mark.asyncio.

What's the recommended way to organize API versions?

Create api/v1/endpoints/ directory for version 1 routes, api/v1/router.py to combine them, then include in main.py. This allows easy addition of v2 endpoints later without breaking existing clients.

How do I handle authentication and authorization?

Implement auth logic in core/security.py and services/auth_service.py. Create a dependency function that validates tokens and returns the current user, then inject it into protected routes using Depends().

Full instructions (SKILL.md)

Source of truth, from wshobson/agents.


name: fastapi-templates description: Create production-ready FastAPI projects with async patterns, dependency injection, and comprehensive error handling. Use when building new FastAPI applications or setting up backend API projects.

FastAPI Project Templates

Production-ready FastAPI project structures with async patterns, dependency injection, middleware, and best practices for building high-performance APIs.

When to Use This Skill

  • Starting new FastAPI projects from scratch
  • Implementing async REST APIs with Python
  • Building high-performance web services and microservices
  • Creating async applications with PostgreSQL, MongoDB
  • Setting up API projects with proper structure and testing

Core Concepts

1. Project Structure

Recommended Layout:

app/
├── api/                    # API routes
│   ├── v1/
│   │   ├── endpoints/
│   │   │   ├── users.py
│   │   │   ├── auth.py
│   │   │   └── items.py
│   │   └── router.py
│   └── dependencies.py     # Shared dependencies
├── core/                   # Core configuration
│   ├── config.py
│   ├── security.py
│   └── database.py
├── models/                 # Database models
│   ├── user.py
│   └── item.py
├── schemas/                # Pydantic schemas
│   ├── user.py
│   └── item.py
├── services/               # Business logic
│   ├── user_service.py
│   └── auth_service.py
├── repositories/           # Data access
│   ├── user_repository.py
│   └── item_repository.py
└── main.py                 # Application entry

2. Dependency Injection

FastAPI's built-in DI system using Depends:

  • Database session management
  • Authentication/authorization
  • Shared business logic
  • Configuration injection

3. Async Patterns

Proper async/await usage:

  • Async route handlers
  • Async database operations
  • Async background tasks
  • Async middleware

Detailed worked examples and patterns

Detailed sections (starting with ## Implementation Patterns) live in references/details.md. Read that file when the navigation summary above is insufficient.

Testing

# tests/conftest.py
import pytest
import asyncio
from httpx import AsyncClient
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

from app.main import app
from app.core.database import get_db, Base

TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:"

@pytest.fixture(scope="session")
def event_loop():
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()

@pytest.fixture
async def db_session():
    engine = create_async_engine(TEST_DATABASE_URL, echo=True)
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

    AsyncSessionLocal = sessionmaker(
        engine, class_=AsyncSession, expire_on_commit=False
    )

    async with AsyncSessionLocal() as session:
        yield session

@pytest.fixture
async def client(db_session):
    async def override_get_db():
        yield db_session

    app.dependency_overrides[get_db] = override_get_db

    async with AsyncClient(app=app, base_url="http://test") as client:
        yield client

# tests/test_users.py
import pytest

@pytest.mark.asyncio
async def test_create_user(client):
    response = await client.post(
        "/api/v1/users/",
        json={
            "email": "test@example.com",
            "password": "testpass123",
            "name": "Test User"
        }
    )
    assert response.status_code == 201
    data = response.json()
    assert data["email"] == "test@example.com"
    assert "id" in data