103 lines
2.9 KiB
Python
103 lines
2.9 KiB
Python
import logging
|
|
import sys
|
|
from pathlib import Path
|
|
from contextlib import asynccontextmanager
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.responses import JSONResponse
|
|
import uvicorn
|
|
|
|
current_dir = Path(__file__).parent
|
|
if str(current_dir) not in sys.path:
|
|
sys.path.insert(0, str(current_dir))
|
|
|
|
from api.chat import router as chat_router
|
|
from api.config import router as config_router
|
|
from api.xiaomi_auth import router as xiaomi_router
|
|
from api.dida_auth import router as dida_router
|
|
from api.auth import router as auth_router
|
|
from api.conversation import router as conversation_router
|
|
from api.device_operations import router as device_operations_router
|
|
from config import settings
|
|
from database import init_database, DatabaseConnectionError
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
try:
|
|
init_database(strict_mode=True)
|
|
except DatabaseConnectionError as e:
|
|
logger.error(f"❌ 数据库初始化失败: {e}")
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
logger.error(f"❌ 未知错误,请联系开发者解决: {e}")
|
|
sys.exit(1)
|
|
|
|
yield
|
|
logger.info("👋 Moss AI 后端服务关闭")
|
|
|
|
|
|
app = FastAPI(
|
|
title="Moss AI Backend API",
|
|
description="智能家居系统后端服务",
|
|
version="1.0.0",
|
|
lifespan=lifespan,
|
|
)
|
|
|
|
# 配置 CORS
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=settings.CORS_ORIGINS,
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
app.include_router(chat_router, prefix="/api/v1", tags=["Chat"])
|
|
app.include_router(conversation_router, prefix="/api/v1", tags=["Conversation"])
|
|
app.include_router(config_router, prefix="/api/v1/config", tags=["Config"])
|
|
app.include_router(xiaomi_router, prefix="/api/v1/xiaomi", tags=["Xiaomi Auth"])
|
|
app.include_router(dida_router, prefix="/api/v1/dida", tags=["Dida Auth"])
|
|
app.include_router(auth_router, prefix="/api/v1/auth", tags=["Authentication"])
|
|
app.include_router(device_operations_router, prefix="/api/v1", tags=["Device Operations"])
|
|
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
return {
|
|
"name": "Moss AI Backend API",
|
|
"version": "1.0.0",
|
|
"status": "运行中",
|
|
"warning": "请浏览正确路径,不要浏览错误路径",
|
|
}
|
|
|
|
|
|
@app.exception_handler(Exception)
|
|
async def global_exception_handler(request, exc):
|
|
logger.error(f"全局异常,请联系开发者解决: {exc}", exc_info=True)
|
|
return JSONResponse(
|
|
status_code=500,
|
|
content={
|
|
"error": "内部服务器错误",
|
|
"message": str(exc),
|
|
}
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
uvicorn.run(
|
|
"__main__:app",
|
|
host=settings.HOST,
|
|
port=settings.PORT,
|
|
reload=settings.DEBUG,
|
|
log_level="info",
|
|
http="h11",
|
|
)
|