home / skills / martinffx / claude-code-atelier / atelier-python-fastapi

This skill helps you build robust FastAPI REST APIs with automatic validation, OpenAPI docs, and clean routing for scalable Python services.

npx playbooks add skill martinffx/claude-code-atelier --skill atelier-python-fastapi

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
4.8 KB
---
name: python:fastapi
description: Building REST APIs with FastAPI, Pydantic validation, and OpenAPI. Use when creating routes, handling requests, designing endpoints, implementing validation, error responses, pagination, or generating API documentation.
user-invocable: false
---

# FastAPI - Modern Python Web APIs

FastAPI is a modern, fast web framework for building APIs with Python, using standard Python type hints. FastAPI automatically validates requests, generates OpenAPI documentation, and provides excellent developer experience.

## Quick Start

### Basic Application

```python
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(
    title="My API",
    description="API for my application",
    version="1.0.0",
)

class Item(BaseModel):
    name: str
    price: float

@app.get("/")
def read_root():
    return {"message": "Hello World"}

@app.post("/items", response_model=Item)
def create_item(item: Item):
    return item
```

**Run with:**
```bash
uvicorn main:app --reload
```

## Core Concepts

### Request & Response Models

Use Pydantic models for automatic validation and serialization:

```python
from pydantic import BaseModel, EmailStr, Field

class CreateUserRequest(BaseModel):
    email: EmailStr
    name: str = Field(min_length=1, max_length=100)
    age: int = Field(ge=18, le=120)

class UserResponse(BaseModel):
    id: int
    email: str
    name: str
    model_config = {"from_attributes": True}  # Enable ORM mode

@app.post("/users", response_model=UserResponse)
def create_user(user: CreateUserRequest):
    """Request validated, response serialized automatically"""
    return user
```

See `references/validation.md` for detailed validation patterns including custom validators and field constraints.

### Routers for Organization

Split routes across routers for clean organization:

```python
# routers/users.py
from fastapi import APIRouter

router = APIRouter(prefix="/users", tags=["users"])

@router.get("/")
def list_users():
    ...

@router.post("/")
def create_user(user: CreateUserRequest):
    ...

# main.py
app.include_router(users.router)
```

### Dependency Injection

FastAPI's core feature for managing dependencies like database sessions and authentication:

```python
from fastapi import Depends
from sqlalchemy.orm import Session

def get_db() -> Session:
    """Database session dependency"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users")
def list_users(db: Session = Depends(get_db)):
    """db automatically injected"""
    return db.query(User).all()
```

See `references/dependencies.md` for advanced patterns including auth services, scoped dependencies, and dependency classes.

## Error Handling

### HTTP Exceptions

```python
from fastapi import HTTPException

@app.get("/users/{user_id}")
def get_user(user_id: int):
    user = db.get(user_id)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user
```

### Custom Exception Handlers

```python
from fastapi import Request
from fastapi.responses import JSONResponse

class BusinessError(Exception):
    def __init__(self, message: str):
        self.message = message

@app.exception_handler(BusinessError)
async def business_error_handler(request: Request, exc: BusinessError):
    return JSONResponse(
        status_code=400,
        content={"error": exc.message},
    )
```

## Project Structure

```
my-api/
├── main.py                   # FastAPI app
├── routers/                  # Route handlers
│   ├── users.py
│   └── products.py
├── schemas/                  # Pydantic models
│   ├── users.py
│   └── products.py
├── services/                 # Business logic
│   └── users.py
├── repositories/             # Data access
│   └── users.py
└── dependencies.py           # Dependency injection
```

## Reference Materials

Detailed patterns for common scenarios:

- **Validation**: `references/validation.md` - Field constraints, custom validators, model validation
- **Dependencies**: `references/dependencies.md` - Auth services, scoped dependencies, advanced injection patterns
- **Middleware**: `references/middleware.md` - CORS, custom middleware, request/response processing
- **API Design**: `references/api-design.md` - REST naming, pagination, OpenAPI customization, status codes

## Best Practices

1. **Use response_model** - Always define explicit response schemas
2. **Validate inputs** - Use Pydantic models with constraints
3. **Dependency injection** - Manage sessions, auth, and cross-cutting concerns
4. **Router organization** - Split routes by resource/domain
5. **Error handling** - Use HTTP exceptions and custom handlers appropriately
6. **Type hints** - FastAPI uses them for both validation and documentation

Overview

This skill covers building REST APIs with FastAPI, using Pydantic for validation and automatic OpenAPI generation. It focuses on practical patterns for routes, request/response models, dependency injection, and error handling to produce robust, documented APIs. Apply these patterns to create maintainable, testable Python services quickly.

How this skill works

The skill shows how to define FastAPI applications and APIRouters, declare request and response schemas with Pydantic, and run the app with Uvicorn. It explains dependency injection for DB sessions and auth, automatic request validation, response serialization, and OpenAPI documentation generation. It also demonstrates structured error handling using HTTPException and custom exception handlers.

When to use it

  • Creating CRUD endpoints with typed request and response models
  • Enforcing input validation and serialization with Pydantic
  • Organizing routes into routers and modular application layout
  • Injecting database sessions, auth, or other services via dependencies
  • Customizing API docs and OpenAPI schemas for clients
  • Implementing consistent error responses and business error handling

Best practices

  • Always declare response_model to control output and docs
  • Use Pydantic field constraints and types (EmailStr, Field, validators) for validation
  • Split routes into routers by resource and include them in main app
  • Manage DB sessions and cross-cutting services with Depends to keep handlers thin
  • Raise HTTPException for standard errors and register handlers for domain errors
  • Prefer explicit type hints throughout to leverage FastAPI’s features

Example use cases

  • Build a users API with CreateUserRequest and UserResponse models, email validation, and age constraints
  • Expose product listing with pagination parameters, response schemas, and router-scoped tags
  • Add authentication dependency to inject current user into protected endpoints
  • Create a shared dependency for a SQLAlchemy session and yield/close it per request
  • Implement a JSON business error handler that maps domain exceptions to 4xx responses

FAQ

How do I validate request payloads?

Declare Pydantic models for requests and use them as function parameters; FastAPI validates automatically and returns 422 on errors.

How do I add OpenAPI docs or custom metadata?

Set title, description, and version on FastAPI() and use response_model, tags, and docstrings; FastAPI exposes /docs and /openapi.json by default.