目前可以成功动态更换模型运行的
This commit is contained in:
132
main.py
132
main.py
@ -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
|
||||
)
|
Reference in New Issue
Block a user