Skip to main content
Running ant generate api my-api produces the following structure:
my-api/
├── api/
│   ├── apis/
│   │   └── aws/
│   │       └── AWSClient.py
│   ├── decorators/
│   │   └── token_required.py
│   ├── helper/
│   │   ├── DBSession.py
│   │   └── execution_tracking/
│   │       ├── APIException.py
│   │       └── Logger.py
│   │   └── functions/
│   │       ├── extract_fields.py
│   │       ├── log_directory_contents.py
│   │       ├── update_dict.py
│   │       ├── update_measurement.py
│   │       └── validation_error.py
│   ├── models/
│   │   └── Default_model.py
│   ├── repositories/
│   │   ├── Repository.py
│   │   └── default_repository.py
│   ├── routes/
│   │   └── default_route.py
│   ├── schemas/
│   │   └── PostDefault_schema.py
│   ├── services/
│   │   └── default_service.py
│   ├── startup/
│   │   ├── Alchemy.py
│   │   └── Environment.py
│   └── app.py
├── .github/
│   └── workflows/
│       └── build_and_push_to_ecr.yml
├── .env
├── docker-compose.yml
├── docker-compose-prod.yml
├── Dockerfile
└── requirements.txt

Top-level files

FileDescription
DockerfileBuilds the Flask app image using python:3.11-slim-buster, runs with gunicorn on port 5000
docker-compose.ymlStarts PostgreSQL and the Flask backend together for local development
docker-compose-prod.ymlProduction compose file pointing at your ECR image
.envLocal environment variables — never commit real credentials
requirements.txtAll Python dependencies

api/ — application root

Everything inside api/ is the Flask application. The Dockerfile copies this directory into /app and sets it as the working directory.

app.py

The Flask application factory. Creates the app, registers CORS, initializes the database, loads .env, and registers all blueprints. Every new route generated by ant generate route is automatically imported and registered here.

startup/

FileDescription
Alchemy.pyCreates the SQLAlchemy engine and db_session. Defines Base (the declarative base all models inherit from). init_db() imports all models and calls Base.metadata.create_all() to create tables.
Environment.pyMaps all environment variables to typed class attributes via os.environ.get(). Import myEnvironment from here instead of reading os.environ directly.

routes/

Flask Blueprints — one file per resource. Each route file defines a blueprint registered at /<route_name> and calls the corresponding service. Routes contain no business logic.

services/

Business logic layer — one file per resource. Services receive data from routes, apply logic, call repositories, and return results. All validation, calculations, and orchestration live here.

repositories/

Data access layer — one file per resource. All SQLAlchemy queries live here. Repositories extend Repository (the base class in Repository.py) which provides add(), add_all(), and delete().

models/

SQLAlchemy dataclass models — one file per table. Each model inherits from Base and uses @dataclass to define columns. No methods, no business logic — column definitions only.

schemas/

Marshmallow schemas for request validation. Used in POST/PUT routes to validate incoming JSON before it reaches the service layer.

decorators/

Custom Flask route decorators. The default project ships token_required and role_required for Bearer token authentication and role-based access.

helper/

Shared utilities available across all layers.
FileDescription
DBSession.pyWraps the SQLAlchemy scoped_session with execute(), execute_commit(), add(), add_all(), and delete() — all with automatic rollback on error
execution_tracking/APIException.pyCustom exception class with status_code and message. Register with @app.errorhandler(APIException) to return JSON error responses automatically.
execution_tracking/Logger.pyStructured logger that auto-tags each log entry with the calling class and method name.
functions/extract_fields.pyExtract a subset of keys from a dict using a regex pattern
functions/validation_error.pyConverts a marshmallow ValidationError into an APIException(400)
functions/update_dict.pyMerge two dicts and remove "NaN" values
functions/log_directory_contents.pyRuns ls -la on a directory and logs the output

apis/

Third-party API client wrappers. The default project ships AWSClient — a boto3 session wrapper that supports profile-based, key-based, and ECS task role authentication.

.github/workflows/

A GitHub Actions workflow that builds the Docker image and pushes it to Amazon ECR on every push to main. Configure the ECR repository and AWS region in the workflow env vars.