fastapi-development

SlanyCukr's avatarfrom SlanyCukr

Build async APIs with FastAPI, including endpoints, dependency injection, validation, and testing. Use when creating REST APIs, web backends, or microservices.

⭐0stars🔀0forks📁View on GitHub🕐Updated Nov 29, 2025

When & Why to Use This Skill

This Claude skill facilitates the rapid development of high-performance, asynchronous REST APIs using the FastAPI framework. It streamlines the entire backend development lifecycle, from defining Pydantic-based data validation and dependency injection to implementing robust error handling and automated testing with TestClient.

Use Cases

  • Developing high-concurrency microservices that leverage Python's async/await capabilities for optimal performance.
  • Rapidly prototyping web backends with automatic Swagger and OpenAPI documentation for immediate frontend integration.
  • Implementing type-safe request handling and data validation to ensure API reliability and reduce runtime errors.
  • Building database-connected services using dependency injection for efficient resource management and cleanup.
nameFastAPI Development
descriptionBuild async APIs with FastAPI, including endpoints, dependency injection, validation, and testing. Use when creating REST APIs, web backends, or microservices.

FastAPI Development

Quick start

Create a basic FastAPI application:

from fastapi import FastAPI

app = FastAPI()

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

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

Run with:

uvicorn main:app --reload

Common patterns

Pydantic models for validation

from pydantic import BaseModel
from typing import Optional

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

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

Dependency injection

from typing import Annotated
from fastapi import Depends

async def common_parameters(
    q: str | None = None,
    skip: int = 0,
    limit: int = 100
):
    return {"q": q, "skip": skip, "limit": limit}

CommonsDep = Annotated[dict, Depends(common_parameters)]

@app.get("/items/")
async def read_items(commons: CommonsDep):
    return commons

Database dependencies with cleanup

async def get_db():
    db = connect_to_database()
    try:
        yield db
    finally:
        db.close()

@app.get("/query/")
async def query_data(db: Annotated[dict, Depends(get_db)]):
    return {"data": "query results"}

Error handling

from fastapi import HTTPException

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id < 1:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

Path and query validation

from typing import Annotated
from fastapi import Path, Query

@app.get("/items/{item_id}")
async def read_item(
    item_id: Annotated[int, Path(gt=0, le=1000)],
    q: Annotated[str, Query(max_length=50)] = None
):
    return {"item_id": item_id, "q": q}

Response models

from pydantic import BaseModel

class ItemPublic(BaseModel):
    id: int
    name: str
    price: float

@app.get("/items/{item_id}", response_model=ItemPublic)
async def read_item(item_id: int):
    return ItemPublic(id=item_id, name="Laptop", price=999.99)

Testing with TestClient

from fastapi.testclient import TestClient

client = TestClient(app)

def test_read_root():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"Hello": "World"}

def test_read_item():
    response = client.get("/items/42?q=test")
    assert response.status_code == 200
    assert response.json() == {"item_id": 42, "q": "test"}

Requirements

pip install fastapi uvicorn
pip install "fastapi[all]"  # Includes all optional dependencies

Key concepts

  • Async/await: Use async def for I/O operations
  • Automatic validation: Request/response validation with Pydantic
  • Dependency injection: Share logic across endpoints with Depends
  • Type hints: Full editor support and validation
  • Interactive docs: Auto-generated Swagger/OpenAPI at /docs
  • Background tasks: Run tasks after response using BackgroundTasks