File size: 2,441 Bytes
5a58b2b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | 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):
# Load model on startup
ModelService.load_model()
yield
# Clean up resources if needed
app = FastAPI(
title=settings.APP_NAME,
version=settings.VERSION,
lifespan=lifespan,
docs_url="/docs",
redoc_url="/redoc"
)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # In production, restrict this to specific domains
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Get absolute path to app directory
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")
# Mount Static Files
app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static")
# Templates
if os.path.exists(TEMPLATES_DIR):
templates = Jinja2Templates(directory=TEMPLATES_DIR)
else:
print(f"Warning: Templates directory not found at {TEMPLATES_DIR}")
# Fallback to avoid crash on import, but routes will fail
templates = Jinja2Templates(directory=".")
# Frontend Routes
@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})
# API Routes
app.include_router(api_router, prefix=settings.API_V1_STR)
# Prometheus Metrics
Instrumentator().instrument(app).expose(app)
if __name__ == "__main__":
import uvicorn
uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)
|