Architecture
Prerequisites: Code organization
As a Python application grows, separating it into layers keeps it maintainable:
app/
routes.py # handles HTTP requests (presentation)
services.py # business logic
repositories.py # database access
models.py # data structures
A route calls a service, a service calls a repository — each layer only talks to the one directly below it. This means swapping the database layer later doesn't require rewriting the business logic or routes.