Routing

from future.routing import Get, Post, Put, Patch, Delete, Head, Options, RouteGroup, WebSocket

Each helper takes path, endpoint, name:

Get("/health", HealthController.ping, "health")
Post("/search", SearchController.search, "search")

endpoint is normally SomeController.action (unbound method). Future instantiates the controller per request. Routes are plain lists — no route decorators.

Path parameters

Get("/stocks/<str:stock_id>", StockController.get_stock, "stocks.show")
Get("/trades/user/<str:user_id>", TradeController.get_trades_by_user, "trades.by_user")

Values are kwargs on the action. Patterns: <int:name>, <str:name> / <string:name>, <uuid:name>, plus /users/:id and {id} forms.

Groups

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

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"),
        ],
    ),
    RouteGroup(
        prefix="/trades",
        name="Trades",
        middlewares=[CORSMiddleware],
        routes=[
            Get("/", TradeController.get_trades, "trades"),
            Get("/<str:trade_id>", TradeController.get_trade, "trades.show"),
        ],
    ),
]
  • prefix concatenates for nested groups.
  • subdomain needs a real APP_DOMAIN (ignored when APP_DOMAIN="").
  • Middleware: see Middleware.

WebSockets

WebSocket("/ws/<int:id>", …) — see WebSockets.

List routes

future routes

Expects app in run.py.