Beginner-friendly FastAPI template with a clean layered architecture:
router -> service -> repository -> database.
- Async FastAPI + SQLAlchemy setup.
- User CRUD example (
/users). - Alembic migrations for PostgreSQL.
- Optional Redis, MongoDB, and AWS helper modules.
- Standard API response shape:
statusmessagedata
- Starter unit and integration-style tests.
src/
main.py # App entrypoint and global middleware/handlers
routers/ # API endpoints
services/ # Business logic
repositories/ # Data access layer
models/ # SQLAlchemy models
schemas/ # Pydantic request/response schemas
response/ # Unified API response builders
tests/ # Unit + integration-style tests
db/
storage/postgres/ # PostgreSQL engine/session
storage/mysql/ # Optional MySQL engine/session
storage/mongo/ # Optional Mongo client
redis/ # Optional Redis client
- Python 3.11+ (or Docker)
- PostgreSQL (for local non-Docker runs)
- Create and activate a virtual environment.
- Install dependencies:
pip install -r requirements.txt- Copy environment file and adjust values:
cp .env.dist .env- For local Postgres, set:
DB_HOST=127.0.0.1
DB_PORT=5432- Run migrations:
alembic upgrade head- Start the app:
uvicorn src.main:app --reload --port 8000Docs:
- Swagger UI:
http://127.0.0.1:8000/docs - ReDoc:
http://127.0.0.1:8000/redoc
Start:
make upStop:
make downLogs:
make logsBase path: /users
GET /users/{id}: returns200or404GET /users/: returns200POST /users/: returns201,409(duplicate email), or500PATCH /users/{id}: returns200,404,409, or500DELETE /users/{id}: returns200,404, or500
Example create request:
{
"name": "Alice",
"email": "alice@example.com"
}Main DB:
DB_USERDB_NAMEDB_HOSTDB_PORTDB_PASSWORD
Optional toggles:
REDIS_IS_ENABLE(note: singularENABLE)MONGO_IS_ENABLEDAWS_IS_ENABLE
Optional tuning:
SQL_ECHOLIMIT_GETLIMIT_PPDTIME_GETTIME_PPD
pytest -qIf test collection fails with missing modules, install dependencies first:
pip install -r requirements.txt- Put HTTP concerns in
routers/. - Put business rules in
services/. - Put database queries in
repositories/. - Keep schemas in
schemas/and response formatting inresponse/.