Production FastAPI Application Architecture
Scale beyond single-file main.py scripts. Structure enterprise FastAPI backends with modular APIRouter blueprints, Pydantic V2 DTOs, and application factories.
Single-File main.py Monolith vs Modular Enterprise FastAPI Layout
Placing 500 lines of code inside `main.py` prevents team collaboration. Split your codebase into feature routers (`app/api/routes/`) and centralized configuration.
# ❌ 500 lines of DB, Models, and Routes in main.py
app = FastAPI()
class UserDB(Base): ...
class UserCreate(BaseModel): ...
@app.post("/users")
def create_user(): ...
# ✅ Modular route in app/api/routes/users.py
router = APIRouter(prefix="/users", tags=["Users"])
@router.post("/", response_model=UserResponse)
def create_user(data: UserCreate, srv = Depends()):
return srv.create_user(data)
📂 Enterprise FastAPI Directory Layout
app/ ├── main.py # App factory & router mounting ├── api/ # Delivery layer: api_v1.py & routes/ (auth, users, products) ├── core/ # Config settings, security JWT, logging ├── models/ # SQLAlchemy ORM database models ├── schemas/ # Pydantic V2 Request & Response DTOs ├── services/ # Business domain logic └── repositories/ # Data persistence abstraction
💻 Production Blueprint: Modular Router & Factory Pattern
Observe how sub-routers are mounted inside `api_v1.py` and instantiated via `create_application()`.
# ─── 1. MASTER V1 ROUTER AGGREGATOR (app/api/api_v1.py) ───────────────────
from fastapi import APIRouter
from api.routes import auth, users, products
api_router = APIRouter(prefix="/api/v1")
api_router.include_router(auth.router)
api_router.include_router(users.router)
api_router.include_router(products.router)
# ─── 2. APPLICATION FACTORY (app/main.py) ─────────────────────────────────
from fastapi import FastAPI
from api.api_v1 import api_router
def create_application() -> FastAPI:
app = FastAPI(title="TeachCloud Enterprise API", version="1.0.0")
app.include_router(api_router)
return app
app = create_application()