目前可以成功动态更换模型运行的

This commit is contained in:
2025-09-12 14:05:09 +08:00
parent 435b2a0e6c
commit 4be7f7bf14
13 changed files with 1518 additions and 325 deletions

132
main.py
View File

@ -1,62 +1,142 @@
from PIL import Image # 正确导入
import numpy as np
import uvicorn
from PIL import Image
import numpy as np
import uvicorn
import threading
import time
import os
from fastapi import FastAPI
from core.all import load_model,detect
# 新增:导入 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
# ------------------------------
# 初始化 FastAPI 应用、指定生命周期管理
# ------------------------------
# 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="内容安全审核后台",
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__":
# -------------------------- 配置调整 --------------------------
# 模型配置路径(建议改为环境变量)
YOLO_MODEL_PATH = r"/core/models\best.pt"
OCR_CONFIG_PATH = r"/core/config\config.yaml"
# 1. 初始化资源
create_directory_structure()
print(f"[初始化] 目录结构创建完成")
# 初始化项目默认端口设为8000、避免初始化失败时port未定义
# 创建模型保存目录
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 服务
uvicorn.run(
app="main:app",
host="0.0.0.0",
port=port,
workers=8,
ws="websockets"
)
workers=1,
ws="websockets",
reload=False
)