Files
ESP32_GDEY042T81_server/main.py
jeremygan2021 a2682dc040 first commit
2025-11-16 17:21:25 +08:00

111 lines
2.8 KiB
Python

from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
import os
from config import settings
from database import init_db
from mqtt_manager import mqtt_manager
from api import api_router
from admin_routes import admin_router
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时执行
logger.info("正在启动墨水屏桌面屏幕系统服务端...")
# 初始化数据库
try:
init_db()
logger.info("数据库初始化完成")
except Exception as e:
logger.error(f"数据库初始化失败: {str(e)}")
# 连接MQTT代理
try:
mqtt_manager.connect()
logger.info("MQTT连接已启动")
except Exception as e:
logger.error(f"MQTT连接失败: {str(e)}")
# 确保静态文件目录存在
os.makedirs(settings.static_dir, exist_ok=True)
yield
# 关闭时执行
logger.info("正在关闭墨水屏桌面屏幕系统服务端...")
# 断开MQTT连接
mqtt_manager.disconnect()
logger.info("MQTT连接已断开")
# 创建FastAPI应用
app = FastAPI(
title=settings.app_name,
description="基于 FastAPI + MQTT + HTTP/HTTPS + NTP 的轻量级墨水屏显示系统服务端",
version="1.0.0",
lifespan=lifespan
)
# 添加CORS中间件
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 在生产环境中应该设置具体的允许来源
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 挂载静态文件
app.mount("/static", StaticFiles(directory=settings.static_dir), name="static")
# 注册API路由
app.include_router(api_router)
# 包含管理后台路由
app.include_router(admin_router, prefix="/admin", tags=["管理后台"])
# 根路径
@app.get("/")
async def root():
return {
"message": "墨水屏桌面屏幕系统服务端",
"version": "1.0.0",
"docs": "/docs",
"redoc": "/redoc"
}
# 健康检查
@app.get("/health")
async def health_check():
return {
"status": "healthy",
"mqtt_connected": mqtt_manager.connected
}
# 中间件:记录请求日志
@app.middleware("http")
async def log_requests(request: Request, call_next):
logger.info(f"请求: {request.method} {request.url}")
response = await call_next(request)
logger.info(f"响应状态码: {response.status_code}")
return response
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
port=9999,
reload=settings.debug
)