Spaces:
Sleeping
Sleeping
import logging # Imports the logging module for event logging. | |
from fastapi import FastAPI # Imports FastAPI, a modern, fast (high-performance) web framework for building APIs. | |
from fastapi.middleware.cors import CORSMiddleware # Imports CORSMiddleware for handling Cross-Origin Resource Sharing. | |
# Imports the API router, recommender system, MongoDB connection, and application settings. | |
#from api.routes import router | |
from src.api.routes import router | |
from src.core.recommender import recommender | |
from src.database.mongodb import mongodb | |
from src.config.settings import API_TITLE, API_DESCRIPTION, API_VERSION | |
# Configure logging settings. | |
logging.basicConfig( | |
level=logging.INFO, # Sets the minimum logging level to INFO. | |
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' # Defines the format for log messages. | |
) | |
logger = logging.getLogger(__name__) # Creates a logger instance for this module. | |
# Create an instance of the FastAPI application. | |
app = FastAPI( | |
title=API_TITLE, # Sets the title of the API, loaded from settings. | |
description=API_DESCRIPTION, # Sets the description of the API, loaded from settings. | |
version=API_VERSION # Sets the version of the API, loaded from settings. | |
) | |
# Add CORS (Cross-Origin Resource Sharing) middleware to the application. | |
# This allows requests from different origins (domains) to access the API. | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], # Allows all origins. In production, this should be restricted to specific origins for security. | |
allow_credentials=True, # Allows cookies to be included in cross-origin requests. | |
allow_methods=["*"], # Allows all HTTP methods (GET, POST, PUT, DELETE, etc.). | |
allow_headers=["*"], # Allows all headers in requests. | |
) | |
# Include the API routes defined in 'src.api.routes.router'. | |
# This makes the endpoints defined in the router accessible through the app. | |
app.include_router(router) | |
async def startup_event(): | |
""" | |
Asynchronous function to be executed when the application starts up. | |
It initializes necessary components like the recommender system. | |
""" | |
try: | |
# Initialize recommender | |
logger.info("Initializing recommender system...") | |
recommender.load_components() | |
app.state.recommender = recommender # Attach recommender to app state | |
logger.info("Recommender system initialized successfully") | |
except Exception as e: | |
logger.error(f"Failed to initialize recommender system: {e}", exc_info=True) | |
raise # Re-raises the caught exception to halt startup if initialization fails. | |
async def shutdown_event(): | |
""" | |
Asynchronous function to be executed when the application shuts down. | |
It performs cleanup tasks, such as closing database connections. | |
""" | |
try: | |
# Close MongoDB connection | |
mongodb.close() | |
logger.info("MongoDB connection closed") | |
except Exception as e: | |
# Logs an error if any issue occurs during the shutdown process. | |
logger.error(f"Error during shutdown: {e}", exc_info=True) | |
# This block executes if the script is run directly (e.g., `python main.py`). | |
if __name__ == "__main__": | |
import uvicorn # Imports Uvicorn, an ASGI server, for running the FastAPI application. | |
# Runs the FastAPI application using Uvicorn. | |
# host="0.0.0.0" makes the server accessible from any network interface. | |
# port=8000 specifies the port on which the server will listen. | |
uvicorn.run(app, host="0.0.0.0", port=8000) |