import os from fastapi import FastAPI, Request, Response from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from fastapi.security import OAuth2PasswordBearer from jose import JWTError, jwt from datetime import datetime, timedelta import json,logging,time from contextlib import asynccontextmanager from dotenv import load_dotenv import uvicorn # 加载 .env 文件中的环境变量 load_dotenv() # 默认加载项目根目录的 .env 文件 from app.asr_service import asr_router from app.monitor_service import monitor_router from app.tts_service import tts_router,tts_lifespan from app.login_service import login_router from app.chat_service import chat_router from app.payment_service import payment_router from app.system_admin import system_admin_router from app.wps_office_service import wps_router @asynccontextmanager async def lifespan(app: FastAPI): """生命周期管理""" # 服务启动初始化 print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") print(" ASR & Monitor Service Start") print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") # 启动TTS路由器的生命周期 tts_lifespan_ctx = tts_lifespan(app) await tts_lifespan_ctx.__aenter__() yield # 关闭TTS路由器的生命周期 await tts_lifespan_ctx.__aexit__(None, None, None) # 服务停止清理 print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") print(" Service Stopped Cleanly") print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") # 创建应用实例 app = FastAPI(lifespan=lifespan) # 配置CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], # 允许所有来源,也可以指定具体的域名,例如 ["https://example.com"] allow_credentials=True, # 是否允许发送 cookies allow_methods=["*"], # 允许所有方法,也可以指定具体的方法,例如 ["GET", "POST"] allow_headers=["*"], # 允许所有头信息,也可以指定具体的头信息 expose_headers=["Content-Range", "Content-Length"] # 关键添加 ) logger = logging.getLogger("api") # @app.middleware("http") async def log_requests(request: Request, call_next): """ 请求日志记录中间件 """ start_time = time.perf_counter() # 记录请求信息 logger.info(f"Request: {request.method} {request.url}") logger.info(f"Headers: {dict(request.headers)}") logger.info(f"Client: {request.client.host}:{request.client.port}") # 读取请求体(注意:这会消耗流式数据) request_body = await request.body() if request_body: logger.info(f"Request body: {request_body.decode('utf-8', errors='ignore')}") # 调用下一个中间件或路由处理程序 response = await call_next(request) # 计算处理时间 process_time = time.perf_counter() - start_time # 记录响应信息 logger.info(f"Response status: {response.status_code}") logger.info(f"Process time: {process_time:.4f}s") return response # 挂载子路由 app.include_router(asr_router, prefix="/asr") app.include_router(monitor_router, prefix="/monitor") app.include_router(tts_router, prefix="/tts") app.include_router(login_router, prefix="/auth") app.include_router(chat_router, prefix="/chat") app.include_router(payment_router, prefix="/payment") app.include_router(system_admin_router,prefix="/system_admin") app.include_router(wps_router,prefix="/wps") # 挂载静态文件(可选) # app.mount("/static", StaticFiles(directory="static"), name="static") if __name__ == "__main__": uvicorn.run("app.main:app", host="0.0.0.0", port=9580)