refactor(#776): 统一配置入口,建立packages/config消除重复定义 #791
Reference in New Issue
Block a user
Delete Branch "refactor/unified-config-entry"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
代码质量专项P1:配置文件分散在8处,3处重复单例实现+重复SettingsConfigDict+alembic绕开配置系统。
改动
packages/config/作为配置统一入口(base/api_settings/worker_settings)packages/config/api_settings.py(APISettings)packages/config/worker_settings.py(WorkerSettings)reload_settings_cache()替代手动_settings=None验证
Issue
#776
代码审查结果 - PR #791
⚠️ 问题(3个需要修改)
packages/config/api_settings.py 第113行:环境变量校验逻辑错误,存在安全隐患。
validate_oss_access_key_id和validate_oss_access_key_secret方法中使用了os.getenv("APP_ENV", "development")来判断当前环境。如果APP_ENV仅在.env文件中定义而未导出为系统环境变量,os.getenv将获取不到值,从而默认为"development"。这会导致在非开发环境下,如果未导出环境变量,系统将跳过对 OSS 密钥的强制非空校验,可能导致服务以空密钥启动或暴露配置错误。mode改为"after",通过self.environment访问已解析的环境变量,确保校验逻辑与 Pydantic 加载的配置一致。apps/api/app/core/config.py 第12行:
reload_settings函数未更新模块级单例,导致配置热更新失效。reload_settings函数中,虽然调用了reload_settings_cache()清空了缓存并返回了新的配置对象,但未更新模块底部的全局变量settings。如果外部代码通过from app.core.config import settings引入了配置,调用reload_settings()后,该引用仍指向旧的配置对象,与app/config.py中的实现(正确更新了全局变量)不一致。apps/api/app/config.py的实现,在函数内部添加global settings并更新settings变量。alembic/env.py 第15行:数据库迁移工具配置回退风险。
get_shared_settings()获取配置。如果当前工作目录下找不到.env文件(例如在某些容器启动脚本或非项目根目录执行时),SharedSettings会使用硬编码的默认值(database_url = "postgresql+psycopg://postgres:postgres@localhost:5432/...")。原代码使用os.getenv,在未设置时会返回 None 从而跳过覆盖。新代码可能导致生产环境迁移脚本意外连接到本地默认数据库,存在严重的安全误操作风险。alembic/env.py中获取配置后,增加检查逻辑:如果settings.database_url等于默认的 localhost 地址且当前环境非 development,应抛出异常或显式警告,防止误连。💡 建议(1个可选)
get_cached_settings使用类名作为缓存键。如果在运行时修改了APP_ENV环境变量(例如在测试中切换环境),由于缓存键不变,函数将返回基于旧环境文件加载的配置对象,直到手动调用reload_settings_cache。建议将env_file的路径或内容哈希纳入缓存键的考量,或者在文档中明确说明切换环境必须调用 reload。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 15:38:00 | 模型:
🗑️ 预览环境已清理
PR #791 已关闭或合并,对应的预览环境已被清理。