Controllers¶
Controllers get request / response from a base class. Routes are plain lists. No route decorators.
future.controllers.Controller injects them in __init__:
from future.controllers import Controller
from future.response import Response
class StockController(Controller):
async def get_stock(self, stock_id: str) -> Response:
return self.response.json({"id": stock_id})
Do not add your own __init__ unless you need extra deps — Future constructs YourController(request, response) per request.
Example¶
from future.controllers import Controller
from future.response import Response
from app.models.Stock import Stock
class StockController(Controller):
async def get_stocks(self) -> Response:
instrument_id = self.request.query.get("instrument_id")
if instrument_id:
stocks = Stock.where("instrument_id", instrument_id).get()
else:
stocks = Stock.all()
return self.response.json([stock.to_dict() for stock in stocks], status=200)
async def get_stock(self, stock_id: str) -> Response:
stock = Stock.find(stock_id)
if stock is None:
return self.response.json({"error": "Not found"}, status=404)
return self.response.json(stock.to_dict(), status=200)
Register class method references, not instances:
from future.routing import Get
Get("/stocks", StockController.get_stocks, "stocks")
Get("/stocks/<str:stock_id>", StockController.get_stock, "stocks.show")
Path params become action kwargs. See Routing, Request, Response.