| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | import uvicorn | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | import threading | 
					
						
							|  |  |  |  | import time | 
					
						
							|  |  |  |  | import os | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | from fastapi import FastAPI | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | from fastapi.middleware.cors import CORSMiddleware | 
					
						
							| 
									
										
										
										
											2025-09-15 17:47:38 +08:00
										 |  |  |  | from service.file_service import app as flask_app | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | # 原有业务导入 | 
					
						
							| 
									
										
										
										
											2025-09-15 17:47:38 +08:00
										 |  |  |  | from core.all import load_model | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | from ds.config import SERVER_CONFIG | 
					
						
							|  |  |  |  | from middle.error_handler import global_exception_handler | 
					
						
							|  |  |  |  | from service.user_service import router as user_router | 
					
						
							| 
									
										
										
										
											2025-09-04 22:59:27 +08:00
										 |  |  |  | from service.sensitive_service import router as sensitive_router | 
					
						
							|  |  |  |  | from service.face_service import router as face_router | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | from service.device_service import router as device_router | 
					
						
							| 
									
										
										
										
											2025-09-15 18:08:54 +08:00
										 |  |  |  | from service.model_service import router as model_router | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | from ws.ws import ws_router, lifespan | 
					
						
							| 
									
										
										
										
											2025-09-09 16:30:12 +08:00
										 |  |  |  | from core.establish import create_directory_structure | 
					
						
							| 
									
										
										
										
											2025-09-04 22:59:27 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | # 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 配置) | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | app = FastAPI( | 
					
						
							|  |  |  |  |     title="内容安全审核后台", | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  |     description="含图片访问服务和动态模型管理", | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  |     version="1.0.0", | 
					
						
							|  |  |  |  |     lifespan=lifespan | 
					
						
							|  |  |  |  | ) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | # ------------------------------ | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | # 新增:完整 CORS 配置(解决跨域问题) | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | # ------------------------------ | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | # 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) | 
					
						
							|  |  |  |  | ) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | # 注册路由(不变) | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | app.include_router(user_router) | 
					
						
							|  |  |  |  | app.include_router(device_router) | 
					
						
							| 
									
										
										
										
											2025-09-04 22:59:27 +08:00
										 |  |  |  | app.include_router(face_router) | 
					
						
							|  |  |  |  | app.include_router(sensitive_router) | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | app.include_router(model_router)  # 模型管理路由 | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | app.include_router(ws_router) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | # 注册全局异常处理器(不变) | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | app.add_exception_handler(Exception, global_exception_handler) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  | # 主服务启动入口(不变) | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2025-09-09 16:30:12 +08:00
										 |  |  |  |     create_directory_structure() | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  |     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}") | 
					
						
							| 
									
										
										
										
											2025-09-09 16:30:12 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  |     # 加载检测模型 | 
					
						
							|  |  |  |  |     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 主服务 | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  |     port = int(SERVER_CONFIG.get("port", 8000)) | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  |     print(f"\n[FastAPI 服务] 准备启动,端口:{port}") | 
					
						
							|  |  |  |  |     print(f"[FastAPI 服务] 接口文档:http://服务器IP:{port}/docs\n") | 
					
						
							| 
									
										
										
										
											2025-09-04 22:59:27 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 18:51:50 +08:00
										 |  |  |  |     uvicorn.run( | 
					
						
							|  |  |  |  |         app="main:app", | 
					
						
							|  |  |  |  |         host="0.0.0.0", | 
					
						
							|  |  |  |  |         port=port, | 
					
						
							| 
									
										
										
										
											2025-09-12 14:05:09 +08:00
										 |  |  |  |         workers=1, | 
					
						
							|  |  |  |  |         ws="websockets", | 
					
						
							|  |  |  |  |         reload=False | 
					
						
							|  |  |  |  |     ) |