| from fastapi import FastAPI, Request |
| from fastapi.staticfiles import StaticFiles |
| from fastapi.templating import Jinja2Templates |
| from fastapi.responses import HTMLResponse |
| from fastapi.middleware.cors import CORSMiddleware |
| from prometheus_fastapi_instrumentator import Instrumentator |
| from app.api.routes import router as api_router |
| from app.core.config import get_settings |
| from app.services.model_service import ModelService |
| from contextlib import asynccontextmanager |
| import os |
|
|
| settings = get_settings() |
|
|
| @asynccontextmanager |
| async def lifespan(app: FastAPI): |
| |
| ModelService.load_model() |
| yield |
| |
|
|
| app = FastAPI( |
| title=settings.APP_NAME, |
| version=settings.VERSION, |
| lifespan=lifespan, |
| docs_url="/docs", |
| redoc_url="/redoc" |
| ) |
|
|
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| |
| BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
| STATIC_DIR = os.path.join(BASE_DIR, "static") |
| TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") |
|
|
| |
| app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") |
|
|
| |
| if os.path.exists(TEMPLATES_DIR): |
| templates = Jinja2Templates(directory=TEMPLATES_DIR) |
| else: |
| print(f"Warning: Templates directory not found at {TEMPLATES_DIR}") |
| |
| templates = Jinja2Templates(directory=".") |
|
|
| |
| @app.get("/", response_class=HTMLResponse) |
| async def read_root(request: Request): |
| return templates.TemplateResponse("index.html", {"request": request}) |
|
|
| @app.get("/calculate", response_class=HTMLResponse) |
| async def read_calculate(request: Request): |
| return templates.TemplateResponse("calculate.html", {"request": request}) |
|
|
| @app.get("/recommendation/{risk_level}", response_class=HTMLResponse) |
| async def read_recommendation(request: Request, risk_level: int): |
| return templates.TemplateResponse("recommendation.html", {"request": request, "risk_level": risk_level}) |
|
|
| |
| app.include_router(api_router, prefix=settings.API_V1_STR) |
|
|
| |
| Instrumentator().instrument(app).expose(app) |
|
|
| if __name__ == "__main__": |
| import uvicorn |
| uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True) |
|
|