← Back to Tutorials

31. Sub-Applications

from fastapi import FastAPI, APIRouter

app = FastAPI()

# Create sub-app
subapp = FastAPI(title="Sub API")

@subapp.get("/sub/items/")
def sub_items():
    return {"message": "This is the sub-app"}

# Mount sub-app at prefix
app.mount("/sub", subapp)

# Using APIRouter (better for organizing)
router = APIRouter(prefix="/api/v1", tags=["v1"])

@router.get("/items/")
def v1_items():
    return {"version": "v1", "items": []}

@router.get("/users/")
def v1_users():
    return {"version": "v1", "users": []}

app.include_router(router)

# Versioning example
v2_router = APIRouter(prefix="/api/v2", tags=["v2"])

@v2_router.get("/items/")
def v2_items():
    return {"version": "v2", "items": [], "new_field": "extended"}

app.include_router(v2_router)

Mounting Starlette Apps

from starlette.applications import Starlette

starlette_app = Starlette()
# ... configure starlette_app
app.mount("/starlette", starlette_app)
✏️ Exercise: Create a main app with two versioned routers (v1 and v2). Each has /items and /users endpoints but v2 returns additional fields.