Spaces:
Running
Running
| """配置加载""" | |
| import json | |
| import os | |
| from typing import Any, cast | |
| from pathlib import Path | |
| from src.utils.logger import get_logger | |
| from .types import AppConfig | |
| # 初始化日志 | |
| logger = get_logger(__name__) | |
| CONFIG_FILE = str(Path(__file__).parent.parent.parent / "config" / "config.json") | |
| def merge_default_config_file() -> bool: | |
| """把新版本默认配置项补进现有 config.json,保留用户已有配置值。""" | |
| default_dict = AppConfig().model_dump() | |
| path = Path(CONFIG_FILE) | |
| changed = False | |
| try: | |
| if path.exists(): | |
| with open(path, 'r', encoding='utf-8') as f: | |
| current = json.load(f) | |
| if not isinstance(current, dict): | |
| current = {} | |
| else: | |
| current = {} | |
| for key, value in default_dict.items(): | |
| if key not in current: | |
| current[key] = value | |
| changed = True | |
| if changed or not path.exists(): | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| tmp = path.with_suffix(path.suffix + ".tmp") | |
| with open(tmp, 'w', encoding='utf-8') as f: | |
| json.dump(current, f, ensure_ascii=False, indent=2) | |
| os.replace(tmp, path) | |
| logger.info("配置文件已合并新版本默认项", extra={"config_file": CONFIG_FILE}) | |
| return changed | |
| except Exception as e: | |
| logger.warning(f"合并配置默认项失败: {e}") | |
| return False | |
| def load_config() -> dict[str, Any]: | |
| """加载配置文件""" | |
| default_config = AppConfig() | |
| if not os.path.exists(CONFIG_FILE): | |
| logger.info("配置文件不存在,使用默认配置", extra={ | |
| "config_file": CONFIG_FILE | |
| }) | |
| return default_config.model_dump() | |
| try: | |
| with open(CONFIG_FILE, 'r', encoding='utf-8') as f: | |
| file_config = json.load(f) | |
| # 将默认配置转为字典 | |
| config_dict = default_config.model_dump() | |
| # 更新其他配置 | |
| config_dict.update(file_config) | |
| # 重新验证并创建模型实例 | |
| final_config = AppConfig(**config_dict) | |
| final_dict = final_config.model_dump() | |
| # 只有在没有请求上下文时(即启动时)打印加载日志 | |
| from src.utils.logger import get_request_id | |
| if not get_request_id(): | |
| logger.info("配置文件加载成功", extra={ | |
| "config_file": CONFIG_FILE, | |
| "port_api": final_dict.get("port_api"), | |
| "debug_mode": final_dict.get("debug") | |
| }) | |
| return final_dict | |
| except Exception as e: | |
| logger.error(f"配置文件加载失败,使用默认配置", extra={ | |
| "config_file": CONFIG_FILE, | |
| "error": str(e) | |
| }) | |
| return default_config.model_dump() | |