FastAPI

Lesson 10

App structure and routers

Organize feature routers and keep app creation focused on wiring rather than route implementation.

Good Code

app/main.py
from fastapi import FastAPI

from app.api import health, reviews, users


def create_app():
    app = FastAPI(title="Review API")

    app.include_router(health.router)
    app.include_router(users.router, prefix="/users", tags=["users"])
    app.include_router(reviews.router, prefix="/reviews", tags=["reviews"])

    return app


app = create_app()

Bad Code

app/main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return await users.find(user_id)


@app.post("/reviews/{review_id}/approve")
async def approve_review(review_id: int):
    review = await reviews.find(review_id)
    await notifications.send(review.author_email)
    return await reviews.approve(review_id)

Review Notes

What to review

Good Code

The good version makes app creation a composition point and leaves feature routes in their own modules.

Bad Code

The bad version turns main.py into a mix of app setup, route definitions, business flow, and side effects.

Takeaways

  • A FastAPI app should wire routers and middleware; feature behavior belongs in focused modules.