Source code for aioli.controller.base
import re
from starlette.endpoints import WebSocketEndpoint
from aioli.component import Component, ComponentMeta
from aioli.exceptions import BootstrapException
from .registry import handlers
def format_path(*parts):
path = ""
for part in parts:
path = f"/{path}/{part}"
return re.sub(r"/+", "/", path.rstrip("/"))
[docs]class BaseHttpController(Component, metaclass=ComponentMeta):
"""HTTP API Controller
:param pkg: Attach to this package
:var pkg: Parent Package
:var config: Package configuration
:var log: Controller logger
"""
[docs] async def on_request(self, *args):
"""Called on request arrival for this Controller"""
def register_routes(self, api_base):
for func, handler in self.handlers:
handler_addr = hex(id(func))
handler_name = f"{self.__class__.__name__}.{handler.name}"
path_full = format_path(api_base, self.config["path"], handler.path)
if not hasattr(self, "pkg"):
raise BootstrapException(f"Superclass of {self} was never created")
self.log.info(
f"Adding Route: {path_full} [{handler.method}] => "
f"{handler.name} [{handler_addr}]"
)
methods = [handler.method]
self.pkg.app.add_route(path_full, func, methods, handler_name)
handler.path_full = path_full
@property
def handlers(self):
for handler in handlers.values():
# Yield only if the stack belongs to the Controller being iterated on
if handler.func.__module__ == self.__module__:
yield getattr(self, handler.name), handler
class BaseWebSocketController(WebSocketEndpoint, Component, metaclass=ComponentMeta):
path = None
encoding = "json"