FastAPI Project Structure Best Practices in Python 2026
A well-organized project structure is crucial for maintainability, scalability, and team collaboration. In 2026, the FastAPI community has converged on a clean, modular, and production-ready project layout.
Recommended Project Structure 2026
my_project/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI app instance
│ ├── core/
│ │ ├── __init__.py
│ │ ├── config.py # Settings with Pydantic
│ │ ├── security.py
│ │ └── database.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── v1/
│ │ │ ├── __init__.py
│ │ │ └── api.py
│ │ └── dependencies.py
│ ├── models/ # Pydantic models & SQLModel
│ ├── schemas/ # Request & Response schemas
│ ├── crud/ # Database operations
│ ├── services/ # Business logic
│ ├── utils/
│ └── routers/ # API routers
├── tests/
├── alembic/ # Database migrations
├── .env
├── pyproject.toml
└── README.md
Key Best Practices 2026
- Separation of Concerns: Keep routers, schemas, models, and services in separate folders
- Use Pydantic Settings for configuration management
- Version your API (e.g.,
/api/v1/) - Dependency Injection — Use
Depends()heavily - SQLModel for combined ORM + Pydantic models
- Background Tasks & Celery/RQ for heavy operations
Example: Modern main.py
from fastapi import FastAPI
from app.core.config import settings
from app.api.v1.api import api_router
app = FastAPI(
title=settings.PROJECT_NAME,
version="1.0.0",
openapi_url=f"{settings.API_V1_STR}/openapi.json"
)
app.include_router(api_router, prefix=settings.API_V1_STR)
@app.get("/")
async def root():
return {"message": "Welcome to the API"}
Conclusion
A clean and scalable project structure is the foundation of any successful FastAPI project in 2026. Following the modular approach with clear separation between routers, schemas, services, and core configuration will save you countless hours as your application grows.
Next steps:
- Restructure your current FastAPI projects using this modern layout
- Related articles: Modern Web Development Best Practices 2026