系统参数应存数据库而非配置文件,因支持Django Admin动态编辑、前端免重启调用;需建独立模型,字段含key(唯一索引)、value(字符串)、data_type(enum)、is_active,并用懒加载+缓存失效机制保障一致性与性能。
系统参数该存在数据库还是配置文件?
存数据库更合适。django admin 能直接编辑,前端调用也方便,不需要重启服务;而硬编码在 settings.py 或 json 配置文件里,每次改参数都得发版或重载进程,运维成本高,也不支持运行时灰度开关。
常见错误是把所有参数塞进一个大字典字段(比如 jsonb),结果没法加索引、不能按 key 查询、Admin 里无法校验类型——后期查 bug 和审计都很痛苦。
- 用独立模型存储,每个参数一行,字段包括
key(唯一索引)、value(文本)、data_type(enum:string/int/bool)、is_active -
value字段统一存字符串,读取时按data_type动态转换(避免数据库类型混杂) - 加
unique_together = ('key', 'is_active')确保启用的 key 不重复
如何安全地读取和缓存参数值?
直接每次从 DB 查会拖慢接口,但全量缓存又难处理更新一致性。推荐「懒加载 + 缓存失效」组合:首次访问时查库并写入 cache.set(),同时监听参数表的 post_save 信号清对应 key 的缓存。
容易忽略的是并发写入冲突:两个请求同时发现缓存 miss,都去查 DB 写缓存,可能造成短暂不一致。解决办法是在 get_value() 方法里加 cache.add() 尝试写入,失败则说明别人已写入,直接读即可。
- 封装成工具函数
get_system_param(key, default=None),内部处理类型转换和缓存逻辑 - 缓存 key 命名为
sysparam:{key},过期时间设为 5 分钟(足够短以保证敏感参数及时生效,足够长以扛住突发流量) - 对布尔型参数,
value存"true"/"false",转换时用str(value).lower() in ("true", "1", "yes")
怎样让非技术人员也能安全修改参数?
Django Admin 默认只暴露 raw 字段,业务方容易输错格式或覆盖关键参数。必须加约束和引导:
- 在 Admin 中重写
formfield_for_choice_field,把data_type下拉选项限制为预设枚举值 - 对
value字段,根据data_type动态切换 widget:整数用NumberInput,布尔用CheckboxInput,字符串用普通TextInput - 加自定义验证:比如
key必须匹配正则^[a-z][a-z0-9_]{2,31}$,避免空格、大写、特殊字符引发代码引用异常 - 禁止删除已启用的参数行(
has_delete_permission返回 False),只允许设is_active=False下线
哪些参数绝对不该放这里?
密钥类(如 AWS_SECRET_ACCESS_KEY)、数据库连接串、调试开关(如 DEBUG=True)绝不能走这套机制。它们需要进程级隔离和启动时加载,放数据库等于把密码明文挂在 Web 后台里。
真正适合的只有业务层可变配置:短信模板 ID、支付超时分钟数、邮件通知开关、灰度用户比例阈值……这些值变动频繁、需 AB 测试、且无安全敏感性。
最常被忽略的一点:参数变更后,依赖它的异步任务(比如 Celery 定时 job)不会自动 reload,得在参数更新信号里主动触发相关 task 的重调度或状态刷新。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











