Getting started

Scaffold with future init, then work in the layout below. Examples match how a real app (controllers, models, run.py) uses Future.

Project layout

myproject/
  run.py                 # Future(...), add_routes, app.run
  .env                   # from .env.example (or use environment.yml — see Configuration)
  app/
    config/
      Settings.py        # load env → APP_*, DB_*
      Database.py        # DATABASES map
    controllers/
    models/
    middleware/
    plugins/
    tasks/
    routes.py
  database/
    migrations/
    seeds/

Boot (run.py)

from app.config.Settings import APP_HOST, APP_PORT, APP_WORKERS, APP_NAME, APP_DOMAIN, APP_DEBUG
from app.config.Database import DATABASES
from app.routes import routes
from future.application import Future
from future.lifespan import Lifespan

config = {
    "APP_DOMAIN": APP_DOMAIN,
    "APP_NAME": APP_NAME,
    "APP_DEBUG": APP_DEBUG,
    "DATABASES": DATABASES,
    "OPENAPI": {
        "enabled": True,
        "uis": ["swagger", "redoc", "scalar", "rapidoc"],
        "auto_routes": False,
    },
}

lifespan = Lifespan(startup_tasks=[], shutdown_tasks=[], cron_tasks=[])
app = Future(lifespan=lifespan, config=config)
app.add_routes(routes)

if __name__ == "__main__":
    app.run(host=APP_HOST, port=APP_PORT, workers=APP_WORKERS)

CLI migrate / seed / routes import this app so DATABASES registers the same way as at runtime.

Controllers

See Controllers. Short version: inherit Controller, use self.request / self.response, register class methods on routes.

Routes (app/routes.py)

from future.openapi import openapi_routes
from future.routing import RouteGroup, Get
from app.controllers.StockController import StockController

routes = [
    RouteGroup(
        name="Docs",
        routes=openapi_routes(uis=["swagger", "redoc", "scalar", "rapidoc"]),
    ),
    RouteGroup(
        prefix="/stocks",
        name="Stocks",
        routes=[
            Get("/", StockController.get_stocks, "stocks"),
            Get("/<str:stock_id>", StockController.get_stock, "stocks.show"),
        ],
    ),
]

First database cycle

cp .env.example .env          # DB_DATABASE=database → database.sqlite
future make:model Stock
# edit annotations on app/models/Stock.py — migrations/seeds are generated from these
future make:migration Stock
future make:seed Stock
future migrate
future seed
future run

Details: Models, Configuration, Database, CLI.