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- FastAPI installed
- SQLAlchemy with async support (sqlalchemy[asyncio])
- pytest and pytest-asyncio for testing
- httpx for async HTTP client testing
How to use fastapi-templates
- 1.Install the skill using the provided command
- 2.Review the recommended project structure in app/ directory
- 3.Set up core configuration in core/config.py and core/database.py
- 4.Create database models in models/ and Pydantic schemas in schemas/
- 5.Implement business logic in services/ and data access in repositories/
- 6.Define API routes in api/v1/endpoints/ using FastAPI's Depends for dependency injection
- 7.Create test fixtures in tests/conftest.py and write async tests using pytest.mark.asyncio
- 8.Run tests with pytest to verify async database operations and API endpoints
Use cases
- 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
- 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
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.
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.
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.
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.
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
Related skills
More from wshobson/agents and the wider catalog.
tailwind-design-system
Build production-ready design systems with Tailwind CSS v4, design tokens, and component libraries.
typescript-advanced-types
Master TypeScript's advanced type system: generics, conditional types, mapped types, and utility types for type-safe applications.
nodejs-backend-patterns
Build production-ready Node.js backends with Express/Fastify, middleware patterns, auth, and database integration.
python-performance-optimization
Profile and optimize Python code using cProfile, memory profilers, and performance best practices.
brand-landingpage
Brand-first landing page designer with guided interviews and Stitch-powered iteration.
python-testing-patterns
Implement comprehensive testing strategies with pytest, fixtures, mocking, and test-driven development.