加密后

This commit is contained in:
2025-09-15 18:35:43 +08:00
parent 3cb83b292e
commit eac8d21c20
8 changed files with 62 additions and 35 deletions

View File

@ -18,12 +18,11 @@ app = Flask(__name__)
# ------------------------------
# 核心修改:与 FastAPI 对齐的跨域配置
# ------------------------------
# 1. 允许的前端域名(完全复制 FastAPI 的 ALLOWED_ORIGINS确保前后端一致
# 1. 允许的前端域名(根据实际环境修改,生产环境删除 "*"
ALLOWED_ORIGINS = [
# "http://localhost:8080", # 本地前端开发地址(必改:替换为你的前端实际地址)
# "http://localhost:8080", # 本地前端开发地址
# "http://127.0.0.1:8080",
# "http://服务器IP:8080", # 部署后前端地址替换为你的服务器IP/域名)
# # "*" 仅开发环境临时使用,生产环境必须删除(安全风险)
# "http://服务器IP:8080", # 部署后前端地址
"*"
]
@ -31,33 +30,29 @@ ALLOWED_ORIGINS = [
CORS(
app,
resources={
r"/*": { # 对所有 Flask 路由生效(覆盖图片、模型下载所有接口)
"origins": ALLOWED_ORIGINS, # 允许的前端域名(与 FastAPI 一致)
"allow_credentials": True, # 允许携带 Cookie与 FastAPI 一致,需登录态必开)
"methods": ["*"], # 允许所有 HTTP 方法FastAPI 用 "*",此处同步)
"allow_headers": ["*"], # 允许所有请求头(与 FastAPI 一致)
r"/*": {
"origins": ALLOWED_ORIGINS,
"allow_credentials": True,
"methods": ["*"],
"allow_headers": ["*"],
}
},
)
# ------------------------------
# 核心路径配置(不变,确保资源目录正确
# 核心路径配置(关键修改:修正 PROJECT_ROOT 计算
# 原问题file_service.py 在 service 文件夹内,需向上跳一级到项目根目录
# ------------------------------
CURRENT_FILE_PATH = Path(__file__).resolve()
PROJECT_ROOT = CURRENT_FILE_PATH.parent # 项目根目录video/
# 资源目录(图片、模型
BASE_IMAGE_DIR_DECT = str((PROJECT_ROOT / "resource" / "dect").resolve()) # 检测图片目录
BASE_IMAGE_DIR_UP_IMAGES = str((PROJECT_ROOT / "up_images").resolve()) # 人脸图片目录
BASE_MODEL_DIR = str((PROJECT_ROOT / "resource" / "models").resolve()) # 模型文件目录
CURRENT_FILE_PATH = Path(__file__).resolve() # 当前文件路径service/file_service.py
PROJECT_ROOT = CURRENT_FILE_PATH.parent.parent # 项目根目录service 文件夹的父目录
# 资源目录(现在正确指向项目根目录下的文件夹
BASE_IMAGE_DIR_DECT = str((PROJECT_ROOT / "resource" / "dect").resolve()) # 根目录/resource/dect
BASE_IMAGE_DIR_UP_IMAGES = str((PROJECT_ROOT / "up_images").resolve()) # 根目录/up_images
BASE_MODEL_DIR = str((PROJECT_ROOT / "resource" / "models").resolve()) # 根目录/resource/models
# 打印路径配置(调试用,确认目录正确)
# logger.info(f"[Flask 配置] 项目根目录:{PROJECT_ROOT}")
# logger.info(f"[Flask 配置] 模型目录:{BASE_MODEL_DIR}")
# logger.info(f"[Flask 配置] 人脸图片目录:{BASE_IMAGE_DIR_UP_IMAGES}")
# logger.info(f"[Flask 配置] 检测图片目录:{BASE_IMAGE_DIR_DECT}")
# ------------------------------
# 安全检查装饰器(不变,防路径遍历/非法文件
# 安全检查装饰器(不变)
# ------------------------------
def safe_path_check(root_dir: str):
def decorator(func):
@ -86,7 +81,7 @@ def safe_path_check(root_dir: str):
)
abort(404)
# 3. 限制文件大小模型200MB图片10MB,避免超大文件攻击
# 3. 限制文件大小模型200MB图片10MB
max_size = 200 * 1024 * 1024 if "models" in root_dir else 10 * 1024 * 1024
if os.path.getsize(full_file_path) > max_size:
logger.warning(
@ -121,7 +116,7 @@ def download_model(resource_path, root_dir):
f"[Flask 模型下载] 成功请求IP{request.remote_addr} | 文件:{file_name} | 目录:{full_dir}"
)
# 强制浏览器下载(而非预览),设置二进制文件类型
# 强制浏览器下载(而非预览)
return send_from_directory(
full_dir,
file_name,
@ -158,7 +153,7 @@ def get_face_image(resource_path, root_dir):
f"[Flask 人脸图片] 成功请求IP{request.remote_addr} | 文件:{file_name} | 目录:{full_dir}"
)
# 允许浏览器预览图片(而非下载)
# 允许浏览器预览图片
return send_from_directory(full_dir, file_name, as_attachment=False)
except Exception as e:
@ -205,7 +200,6 @@ def get_dect_image(resource_path, root_dir):
@safe_path_check(root_dir=BASE_IMAGE_DIR_DECT)
def get_compatible_image(resource_path, root_dir):
try:
# 逻辑与检测图片接口一致仅URL前缀不同兼容旧前端
resource_path = resource_path.replace("/", os.sep).replace("\\", os.sep)
dir_path, file_name = os.path.split(resource_path)
full_dir = os.path.abspath(os.path.join(root_dir, dir_path))
@ -230,7 +224,7 @@ def get_compatible_image(resource_path, root_dir):
abort(500)
# ------------------------------
# 全局错误处理器(友好提示,与 FastAPI 错误信息风格一致
# 全局错误处理器(不变
# ------------------------------
@app.errorhandler(403)
def forbidden_error(error):
@ -256,7 +250,7 @@ def server_error(error):
# Flask 独立启动入口(供测试,实际由 main.py 子线程启动)
# ------------------------------
if __name__ == '__main__':
# 确保所有资源目录存在(防止初始化失败)
# 确保所有资源目录存在
required_dirs = [
(BASE_IMAGE_DIR_DECT, "检测图片目录"),
(BASE_IMAGE_DIR_UP_IMAGES, "人脸图片目录"),
@ -267,16 +261,16 @@ if __name__ == '__main__':
logger.info(f"[Flask 初始化] {dir_desc}不存在,创建:{dir_path}")
os.makedirs(dir_path, exist_ok=True)
# 启动提示(含访问示例)
# 启动提示
logger.info("\n[Flask 服务启动成功!] 支持的接口:")
logger.info(f"1. 模型下载 → http://服务器IP:5000/model/download/resource/models/xxx.pt")
logger.info(f"2. 人脸图片 → http://服务器IP:5000/up_images/xxx.jpg")
logger.info(f"3. 检测图片 → http://服务器IP:5000/resource/dect/xxx.jpg 或 http://服务器IP:5000/images/xxx.jpg\n")
# 启动服务(禁用 debug 和自动重载,避免多线程冲突
# 启动服务(禁用 debug 和自动重载)
app.run(
host="0.0.0.0", # 允许外部IP访问
port=5000, # 与 main.py 中 Flask 端口一致
host="0.0.0.0",
port=5000,
debug=False,
use_reloader=False
)