from PIL import Image import numpy as np import uvicorn import threading import time import os from fastapi import FastAPI # 新增:导入 CORS 相关依赖 from fastapi.middleware.cors import CORSMiddleware # 导入 Flask 服务实例 from app import app as flask_app # 原有业务导入 from core.all import load_model, detect from ds.config import SERVER_CONFIG from middle.error_handler import global_exception_handler from service.user_service import router as user_router from service.sensitive_service import router as sensitive_router from service.face_service import router as face_router from service.device_service import router as device_router from service.model_service import router as model_router # 模型管理路由 from ws.ws import ws_router, lifespan from core.establish import create_directory_structure # Flask 服务启动函数(不变) def start_flask_service(): try: print(f"\n[Flask 服务] 准备启动,端口:5000") print(f"[Flask 服务] 访问示例:http://服务器IP:5000/resource/dect/ocr/xxx.jpg\n") BASE_IMAGE_DIR = os.path.abspath(os.path.join("resource", "dect")) if not os.path.exists(BASE_IMAGE_DIR): print(f"[Flask 服务] 图片根目录不存在,创建:{BASE_IMAGE_DIR}") os.makedirs(BASE_IMAGE_DIR, exist_ok=True) flask_app.run( host="0.0.0.0", port=5000, debug=False, use_reloader=False ) except Exception as e: print(f"[Flask 服务] 启动失败:{str(e)}") # 初始化 FastAPI 应用(新增 CORS 配置) app = FastAPI( title="内容安全审核后台", description="含图片访问服务和动态模型管理", version="1.0.0", lifespan=lifespan ) # ------------------------------ # 新增:完整 CORS 配置(解决跨域问题) # ------------------------------ # 1. 允许的前端域名(根据实际情况修改!本地开发通常是 http://localhost:8080 等) ALLOWED_ORIGINS = [ # "http://localhost:8080", # 前端本地开发地址(必改,填实际前端地址) # "http://127.0.0.1:8080", # "http://服务器IP:8080", # 部署后前端地址(如适用) "*" #表示允许所有域名(开发环境可用,生产环境不推荐) ] # 2. 配置 CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=ALLOWED_ORIGINS, # 允许的前端域名 allow_credentials=True, # 允许携带 Cookie(如需登录态则必开) allow_methods=["*"], # 允许所有 HTTP 方法(包括 PUT/DELETE) allow_headers=["*"], # 允许所有请求头(包括 Content-Type) ) # 注册路由(不变) app.include_router(user_router) app.include_router(device_router) app.include_router(face_router) app.include_router(sensitive_router) app.include_router(model_router) # 模型管理路由 app.include_router(ws_router) # 注册全局异常处理器(不变) app.add_exception_handler(Exception, global_exception_handler) # 主服务启动入口(不变) if __name__ == "__main__": # 1. 初始化资源 create_directory_structure() print(f"[初始化] 目录结构创建完成") # 创建模型保存目录 MODEL_SAVE_DIR = os.path.join("core", "models") os.makedirs(MODEL_SAVE_DIR, exist_ok=True) print(f"[初始化] 模型保存目录:{MODEL_SAVE_DIR}") # # 模型路径配置 # YOLO_MODEL_PATH = os.path.join("core", "models", "best.pt") # OCR_CONFIG_PATH = os.path.join("core", "config", "config.yaml") # print(f"[初始化] 默认YOLO模型路径:{YOLO_MODEL_PATH}") # print(f"[初始化] OCR 配置路径:{OCR_CONFIG_PATH}") # 加载检测模型 try: load_success = load_model() if load_success: print(f"[初始化] 检测模型加载完成") else: print(f"[初始化] 未找到默认模型,可通过API上传并设置默认模型") except Exception as e: print(f"[初始化] 模型加载警告:{str(e)}(服务仍启动)") # 2. 启动 Flask 服务(子线程) flask_thread = threading.Thread( target=start_flask_service, daemon=True ) flask_thread.start() # 等待 Flask 初始化 time.sleep(1) if flask_thread.is_alive(): print(f"[Flask 服务] 启动成功(运行中)") else: print(f"[Flask 服务] 启动失败!图片访问不可用") # 3. 启动 FastAPI 主服务 port = int(SERVER_CONFIG.get("port", 8000)) print(f"\n[FastAPI 服务] 准备启动,端口:{port}") print(f"[FastAPI 服务] 接口文档:http://服务器IP:{port}/docs\n") uvicorn.run( app="main:app", host="0.0.0.0", port=port, workers=1, ws="websockets", reload=False )