''' Date: 2025-05-06 09:26:51 LastEditors: 陈子健 LastEditTime: 2025-05-26 17:14:17 FilePath: /mac-lyric-vue/backend/main.py ''' """ lyroc 后端主程序 负责初始化应用和启动服务器 """ import uvicorn import os import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware # 导入自定义模块 from modules.websocket_manager import ConnectionManager from modules.background_tasks import start_background_task, cancel_all_tasks, background_tasks from modules.routes import register_routes # 配置日志 logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) # 应用支持目录和歌词目录在lyrics模块中已定义 # Lifespan 上下文管理器,替代 on_event @asynccontextmanager async def lifespan(app: FastAPI): logger.info("正在启动API服务...") try: # 启动时创建后台任务 start_background_task(manager) logger.info("后台任务已启动") except Exception as e: logger.error(f"启动后台任务失败: {e}") yield # 应用正常运行 # 关闭时清理任务 try: cancel_all_tasks() logger.info("后台任务已关闭") except Exception as e: logger.error(f"关闭后台任务失败: {e}") # 创建FastAPI应用 app = FastAPI(lifespan=lifespan) # 确保在应用启动时直接启动任务(作为后备方案) @app.on_event("startup") async def startup_event(): # 仅当通过 lifespan 未启动任务时才启动 if not background_tasks: logger.info("通过startup_event启动后台任务...") try: start_background_task(manager) logger.info("后台任务通过startup_event成功启动") except Exception as e: logger.error(f"通过startup_event启动后台任务失败: {e}") # 配置CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 创建WebSocket连接管理器 manager = ConnectionManager() # 注册API路由 register_routes(app, manager) if __name__ == "__main__": # 从环境变量获取端口号,如果未设置则默认使用5000 port = int(os.environ.get("PORT", 5000)) logger.info(f"启动后端服务器在端口: {port}") uvicorn.run("main:app", host="127.0.0.1", port=port, reload=True)