Skip to main content

Flask scaffolding CLI with component architecture and support for SQLAlchemy, Redis caching, async tasks, and Elasticsearch analytics

Project description

overflask

A CLI tool that scaffolds Flask projects with component-based architecture, and a runtime library that adds SQLAlchemy models, Redis caching, async/recurring tasks, and Elasticsearch analytics on top of Flask.

Create a project

Via Docker (no install required):

docker run --rm -it -u $(id -u):$(id -g) -v $(pwd):/workspace overflask/overflask create myapp

Or install and run locally:

pip install overflask @ git+https://gitlab.com/overflask/overflask.git
overflask create myapp

The CLI prompts for an initial component name and Postgres/Redis connection details, generates the project, pre-fills .env, and optionally starts the database containers.

myapp/
├── manage.py           # project CLI
├── settings.py         # configuration
├── requirements.pip    # dependencies
├── compose.yaml        # Docker Compose
├── conftest.py         # pytest fixtures
├── ops/
│   ├── env.template
│   ├── migrations/     # Alembic
│   └── setup-traefik.sh
├── docs/
└── components/
    └── myapp/
        ├── models.py
        ├── views.py
        ├── services.py
        ├── cli.py
        ├── tasks.py
        └── tests.py

Add a component

python manage.py component add auth

Creates components/auth/ with the same structure and registers it in settings.COMPONENTS.

Runtime library

Generated projects import directly from overflask:

Models

from overflask import ModelBase
from sqlalchemy.orm import Mapped, mapped_column

class User(ModelBase):
    # __tablename__ auto-set to "auth_users"
    id: Mapped[int] = mapped_column(primary_key=True)
    email: Mapped[str] = mapped_column(String(255), unique=True)

Table names are derived automatically as {component}_{plural_snake_case_model_name}.

Redis cache

from overflask import cached

@cached(ttl=300)
def get_user(user_id: int):
    ...

Backed by Redis db 15 with stampede prevention via locking.

Async tasks

from overflask import async_task

@async_task
def send_welcome_email(user_id: int, email: str) -> None:
    ...

# Enqueue immediately or with a delay
send_welcome_email.queue(user_id=42, email="alice@example.com")
send_welcome_email.queue(timedelta(minutes=5), user_id=42, email="alice@example.com")

Recurring tasks

from overflask import recurring_task

@recurring_task("0 9 * * MON-FRI")
def daily_report() -> None:
    ...

Tasks are stored in Elasticsearch and dispatched via Redis. Run the supporting processes:

python manage.py tasks scheduler   # polls ES, dispatches due tasks
python manage.py tasks worker      # executes tasks from Redis queue

Analytics

from overflask.analytics import Analytics

Analytics.record("user.registered", area="auth", plan="free")
Analytics.record("purchase.completed", area="billing", amount=99)

Events are buffered in-process and bulk-flushed to Elasticsearch in the background. Each area gets its own monthly index (myapp_analytics_auth-2026.03).

Database migrations

python manage.py db migrate -m "add users table"
python manage.py db upgrade
python manage.py db downgrade 001

Testing

pytest               # all tests
pytest -m unit       # unit tests only (no DB)
pytest -m integration
pytest -n auto       # parallel

Integration tests run against a real PostgreSQL instance using a cloned template database — fast isolation without create_all() per test. Redis is always replaced with fakeredis.

Deployment

The generated project ships with a Gunicorn config and Traefik integration for HTTPS:

bash ops/setup-traefik.sh   # one-time Traefik setup per server
docker compose up -d
docker compose exec web python manage.py db upgrade

See docs/traefik.md and docs/gunicorn.md in the generated project for details.

Development

pip install -e ".[dev]"
pytest
ruff check src/ tests/
ruff format src/ tests/

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

overflask-0.8.1.tar.gz (82.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

overflask-0.8.1-py3-none-any.whl (77.7 kB view details)

Uploaded Python 3

File details

Details for the file overflask-0.8.1.tar.gz.

File metadata

  • Download URL: overflask-0.8.1.tar.gz
  • Upload date:
  • Size: 82.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for overflask-0.8.1.tar.gz
Algorithm Hash digest
SHA256 0b297d9352a963c585f67a799c09355cdb9391e25b57a7a6e483ed9a78540609
MD5 4e43fb8da909ef68639ae6bcc35f8192
BLAKE2b-256 cd221d2530f6b3f81d26b7b884daefdc562dc2a502f0c2c7d8acb2513fd7ee97

See more details on using hashes here.

File details

Details for the file overflask-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: overflask-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 77.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for overflask-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f11d96bfd7f56c3dca47de339567d86e19617ebb2bcddd3e30c3bfa59f57b834
MD5 feae6893e8027e81529fbfb277e821c4
BLAKE2b-256 67a574aee00ca4e21dd318f5e0e8d2d926e444a006ad7210d1f774c16edd5066

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page