semantix-api / main.py
Miroir's picture
Moved service initialization outside of the lifespan context manager
8a39773
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from loguru import logger
import sys
from config import settings
from routes import word, health, study
from services.word_service import WordEmbeddingService
from services.visualization_service import VisualizationService
from services.study_service import StudyService
# Configure logger
logger.remove()
logger.add(
sys.stdout,
format="{time} | {level} | {message}",
level="INFO",
serialize=False
)
# Initialize services first
word_service = WordEmbeddingService(settings.model_url)
visualization_service = VisualizationService(word_service)
study_service = StudyService(word_service)
@asynccontextmanager
async def lifespan(app: FastAPI):
# Startup
logger.info("Starting up...")
try:
yield
except Exception as e:
logger.error(f"Error during startup: {str(e)}")
raise
finally:
# Cleanup
logger.info("Shutting down...")
# Initialize FastAPI app
app = FastAPI(
title=settings.app_name,
version=settings.version,
lifespan=lifespan
)
# Configure CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include routers with direct service injection
app.include_router(
word.init_router(word_service),
tags=["word operations"]
)
app.include_router(
study.init_router(study_service),
tags=["study operations"]
)
app.include_router(
health.init_router(word_service),
tags=["health"]
)
@app.get("/")
async def root():
"""Root endpoint with API information"""
return {
"app_name": settings.app_name,
"version": settings.version,
"status": "running"
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=8000,
reload=settings.debug
)