54 lines
1.3 KiB
Python
54 lines
1.3 KiB
Python
import uuid
|
|
|
|
import structlog
|
|
from fastapi import FastAPI, Request, Response
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
app = FastAPI()
|
|
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")
|
|
|