fix: settings PUT 后热更新内存 — 无需重启即生效
问题:修改 Telegram 等设置后需要重启服务器才能生效,
因为 load_settings_from_db() 只在启动时运行。
修复:PUT /api/settings/{key} 写入 DB 后,
同步更新 settings 内存对象(DB_OVERRIDE_MAP 映射 + INT_SETTINGS 类型转换)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+17
-1
@@ -102,13 +102,29 @@ async def set_setting(
|
||||
admin: Admin = Depends(get_current_admin),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
"""Set a system setting value (immutable keys are rejected)"""
|
||||
"""Set a system setting value (immutable keys are rejected)
|
||||
|
||||
Writes to DB AND hot-reloads the in-memory settings object so changes
|
||||
take effect immediately without server restart.
|
||||
"""
|
||||
if key in IMMUTABLE_KEYS:
|
||||
raise HTTPException(status_code=403, detail=f"Setting '{key}' is immutable and cannot be modified via API")
|
||||
|
||||
repo = SettingRepositoryImpl(db)
|
||||
setting = await repo.set(key, str(payload.value))
|
||||
|
||||
# Hot-reload: update in-memory settings so changes take effect immediately
|
||||
from server.config import settings as _settings
|
||||
attr_name = _settings.DB_OVERRIDE_MAP.get(key)
|
||||
if attr_name and hasattr(_settings, attr_name):
|
||||
value = setting.value
|
||||
if attr_name in _settings.INT_SETTINGS:
|
||||
try:
|
||||
value = int(value)
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
setattr(_settings, attr_name, value)
|
||||
|
||||
# Audit log
|
||||
audit_repo = AuditLogRepositoryImpl(db)
|
||||
await audit_repo.create(AuditLog(
|
||||
|
||||
Reference in New Issue
Block a user