Coverage for packages/server/src/langgate/server/main.py: 71%
28 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
1from collections.abc import AsyncIterator
2from contextlib import asynccontextmanager
4from fastapi import FastAPI, Request
5from starlette.middleware.cors import CORSMiddleware
6from starlette.responses import Response
8from langgate.core.logging import configure_logger
9from langgate.server.api.api_v1.api import registry_router
10from langgate.server.core.config import settings
11from langgate.server.core.logging import (
12 debug_request,
13 get_logger,
14 is_debug,
15 set_structlog_request_context,
16)
18configure_logger(json_logs=settings.JSON_LOGS)
20logger = get_logger(__name__)
21IS_DEBUG = is_debug()
24@asynccontextmanager
25async def lifespan(app: FastAPI) -> AsyncIterator[None]:
26 """Handle application startup and shutdown events."""
27 logger.info("application_startup")
28 yield
29 logger.info("application_shutdown")
32app = FastAPI(
33 title=settings.PROJECT_NAME,
34 openapi_url=f"{settings.API_V1_STR}/openapi.json",
35 docs_url=f"{settings.API_V1_STR}/docs",
36 redoc_url=f"{settings.API_V1_STR}/redoc",
37 lifespan=lifespan,
38)
40if settings.CORS_ORIGINS:
41 app.add_middleware(
42 CORSMiddleware,
43 allow_origins=[str(origin) for origin in settings.CORS_ORIGINS],
44 allow_credentials=True,
45 allow_methods=["*"],
46 allow_headers=["*"],
47 )
50@app.middleware("http")
51async def logging_middleware(request: Request, call_next) -> Response:
52 set_structlog_request_context(request)
53 if IS_DEBUG:
54 await debug_request(logger, request)
55 response: Response = await call_next(request)
56 return response
59app.include_router(registry_router, prefix=settings.API_V1_STR)