feat: reload_config 返回错误详情 + 远程配置增加 schema 校验
6. reload_config() 吞掉异常详情: - 返回类型从 bool 改为 tuple[bool, str],包含具体错误信息 - API 层将错误详情返回给前端,便于排查 - 异常统一记录到日志 8. 远程配置无 schema 校验: - 后端新增 MaterialsConfig Pydantic Model 校验 materials.json 结构 - load_config() 远程/本地配置均先校验再应用,格式错误时抛出明确异常 - 前端 CoverDesign 新增 isValidBgConfig() 运行时校验 bg-config.json - 校验失败时优雅降级到本地配置,避免页面白屏
This commit is contained in:
@@ -14,6 +14,9 @@ import re
|
||||
from pathlib import Path
|
||||
|
||||
import httpx
|
||||
from pydantic import ValidationError
|
||||
|
||||
from app.schemas.materials import MaterialsConfig
|
||||
|
||||
# 正则:从文件名中提取时长,如 plumbing_10s_a23f8fcb.mp4 → 10
|
||||
_DURATION_RE = re.compile(r"_(\d+)s_")
|
||||
@@ -59,6 +62,16 @@ def _apply_config(data: dict) -> None:
|
||||
_materials[slug] = parsed
|
||||
|
||||
|
||||
def _validate_config(data: dict) -> dict:
|
||||
"""使用 Pydantic Schema 校验配置结构,失败时抛出 ValidationError"""
|
||||
try:
|
||||
validated = MaterialsConfig.model_validate(data)
|
||||
return validated.model_dump()
|
||||
except ValidationError as e:
|
||||
logger.error(f"素材配置格式校验失败: {e}")
|
||||
raise ValueError(f"素材配置格式错误: {e}") from e
|
||||
|
||||
|
||||
def load_config() -> None:
|
||||
"""加载素材配置:优先远程 CDN,fallback 本地文件"""
|
||||
global _keywords, _materials
|
||||
@@ -69,6 +82,7 @@ def load_config() -> None:
|
||||
response = client.get(REMOTE_CONFIG_URL)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
_validate_config(data)
|
||||
_apply_config(data)
|
||||
return
|
||||
except Exception as e:
|
||||
@@ -83,16 +97,22 @@ def load_config() -> None:
|
||||
with open(config_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
_validate_config(data)
|
||||
_apply_config(data)
|
||||
|
||||
|
||||
def reload_config() -> bool:
|
||||
"""手动重新加载配置(用于更新素材后即时生效)"""
|
||||
def reload_config() -> tuple[bool, str]:
|
||||
"""手动重新加载配置(用于更新素材后即时生效)
|
||||
|
||||
Returns:
|
||||
(是否成功, 错误信息)。成功时错误信息为空字符串。
|
||||
"""
|
||||
try:
|
||||
load_config()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
return True, ""
|
||||
except Exception as e:
|
||||
logger.warning(f"素材配置重载失败: {e}")
|
||||
return False, str(e)
|
||||
|
||||
|
||||
def match_material(
|
||||
|
||||
Reference in New Issue
Block a user