Extending FastAppKit

How to customize and extend fastappkit for your needs.

Subclassing FastAppKit

Customize the FastAPI app creation:

from fastappkit.core.kit import FastAppKit
from fastapi import FastAPI
from core.config import Settings

class CustomFastAppKit(FastAppKit):
    def create_app(self) -> FastAPI:
        app = super().create_app()

        # Add custom middleware
        from fastapi.middleware.cors import CORSMiddleware
        app.add_middleware(
            CORSMiddleware,
            allow_origins=["*"],
            allow_credentials=True,
            allow_methods=["*"],
            allow_headers=["*"],
        )

        # Customize app metadata
        app.title = "My Custom API"
        app.version = "1.0.0"
        app.description = "Custom API description"

        # Add exception handlers
        @app.exception_handler(ValueError)
        async def value_error_handler(request, exc):
            return {"error": str(exc)}

        return app

# Use custom class
settings = Settings()
kit = CustomFastAppKit(settings=settings)
app = kit.create_app()

Custom App Loading

Override app loading behavior:

from fastappkit.core.loader import AppLoader
from fastappkit.core.registry import AppRegistry

class CustomAppLoader(AppLoader):
    def load_all(self) -> AppRegistry:
        registry = super().load_all()

        # Custom logic: filter apps, modify metadata, etc.
        # ...

        return registry

Custom Router Assembly

Customize router mounting:

from fastappkit.core.router import RouterAssembler
from fastappkit.core.registry import AppRegistry
from fastapi import FastAPI

class CustomRouterAssembler(RouterAssembler):
    def assemble(self, app: FastAPI, registry: AppRegistry) -> None:
        # Custom mounting logic
        for app_metadata in registry.list():
            if app_metadata.router:
                # Custom prefix logic
                prefix = self._custom_prefix(app_metadata)
                app.include_router(app_metadata.router, prefix=prefix)

Middleware and Exception Handlers

Add middleware and exception handlers in core/app.py:

from core.config import Settings
from fastappkit.core.kit import FastAppKit
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import time

settings = Settings()
kit = FastAppKit(settings=settings)
app = kit.create_app()

# Add middleware
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

# Add exception handlers
@app.exception_handler(ValueError)
async def value_error_handler(request: Request, exc: ValueError):
    return JSONResponse(
        status_code=400,
        content={"error": str(exc)}
    )

Custom Settings Access

Create custom settings accessors:

from fastappkit.conf import get_settings
from core.config import Settings

def get_database_url() -> str:
    """Custom accessor for database URL."""
    settings = get_settings()
    return settings.database_url

# Use in routes
from fastapi import APIRouter

router = APIRouter()

@router.get("/db-info")
def db_info():
    db_url = get_database_url()
    return {"database": db_url}

Learn More