import uuid import structlog from fastapi import FastAPI, Request, Response from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates app = FastAPI( servers = [ {"url": "https://kennel.hatecomputers.club", "description": "prod"} ] ) logger = structlog.get_logger() @app.middleware("http") async def logger_middleware(request: Request, call_next): structlog.contextvars.clear_contextvars() structlog.contextvars.bind_contextvars( path=request.url.path, method=request.method, client_host=request.client.host, request_id=str(uuid.uuid4()), ) response = await call_next(request) structlog.contextvars.bind_contextvars( status_code=response.status_code, ) # Exclude /healthcheck endpoint from producing logs if request.url.path != "/healthcheck": if 400 <= response.status_code < 500: logger.warn("Client error") elif response.status_code >= 500: logger.error("Server error") else: logger.info("OK") return response templates = Jinja2Templates(directory="templates") @app.get("/healthcheck") async def healthcheck(): return Response("hello") @app.get("/") async def read_main(request: Request): return templates.TemplateResponse( request=request, name="index.html" ) app.mount("/static", StaticFiles(directory = "static"), name = "static")