应使用 python-decouple 读取环境变量以避免硬编码敏感信息,它强制从环境变量或 .env 文件加载、不回退硬编码,并支持类型转换与缺失值检查,部署时天然兼容 ci/cd 和 docker。

用 python-decouple 读取环境变量而不是硬编码配置
硬编码敏感信息(比如 DB_PASSWORD 或 SECRET_KEY)进 Python 文件,等于把钥匙贴在门框上。哪怕加了 .gitignore,本地误提交、IDE 缓存、Docker 构建上下文泄露都可能让密钥逃逸。python-decouple 是最轻量也最不容易翻车的选择——它强制你从环境变量或独立配置文件加载值,且默认不回退到硬编码。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 安装:
pip install python-decouple - 新建
.env文件(确保已加入.gitignore),写入SECRET_KEY=abc123,不要加引号,也不要用空格 - 代码里用
from decouple import config,然后config('SECRET_KEY')读取;如果必须提供默认值,显式写config('DEBUG', default=False, cast=bool) - 部署时直接用系统环境变量覆盖
.env,decouple优先读环境变量,天然支持 CI/CD 注入
os.environ.get() 的陷阱:类型和缺失值处理不当
很多人图省事直接用 os.environ.get('API_TOKEN'),但这个函数返回的是字符串或 None,而你的代码可能期待布尔值、整数或非空字符串。一旦环境变量没设,None 往下传,可能到数据库连接时才爆 TypeError,排查路径长、错误位置偏移。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 永远别裸用
os.environ.get()读敏感配置;至少加一层校验:token = os.environ.get('API_TOKEN'); if not token: raise ValueError('API_TOKEN missing') - 需要转类型时,自己封装小函数,比如
int(os.environ.get('PORT', '8000')),但注意字符串转整数失败会抛ValueError,得包try/except - 如果项目已有
django-environ或pydantic-settings,它们内置类型解析和缺失检查,比手写更稳
Django 项目里别把 SECRET_KEY 放进 settings.py
Django 启动时只要 SECRET_KEY 是空、None 或长度不够,就会直接报 SyntaxError 或 ImproperlyConfigured,而且错误堆栈常指向无关行,让人误以为是语法问题。更麻烦的是,很多教程教你在 settings.py 里写 if DEBUG: SECRET_KEY = 'dev-key' else: SECRET_KEY = os.environ['SECRET_KEY']——这等于把生产密钥的加载逻辑和开发逻辑耦死,测试、预发环境容易漏配。
Angel工作室企业网站管理系统全DIV+CSS模板,中英文显示,防注入sql关键字过滤,多浏览器适应,完美兼容IE6-IE8,火狐,谷歌等符合标准的浏览器,模板样式集中在一个CSS样式中,内容与样式完全分离,方便网站设计人员开发模板与管理。系统较为安全,以设计防注入,敏感字符屏蔽。新闻,产品,单页独立关键字设计,提高搜索引擎收录。内置IIS测试,双击打启动预览网站 Angel工作室企业网站
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 统一用
decouple.Config或environ.Env初始化配置对象,在settings.py顶部就加载,再通过config('SECRET_KEY', cast=str)获取 -
SECRET_KEY必须设为必需项,不给默认值:config('SECRET_KEY')(不带default=...),让它启动失败得早、错得明 - 本地开发用
.env,CI/CD 用 secret 注入,Docker 部署用--env-file,三者走同一套读取逻辑,避免环境差异
加密存储不是万能解:别用 fernet 自己加密配置文件
看到“加密”就上 cryptography.fernet 加密整个 config.json,结果密钥又得存在哪?最后还是落到环境变量或文件里,等于套娃。而且每次改配置都要解密→编辑→加密,CI/CD 流水线根本没法自动化,运维同学想查个值还得找密钥轮子。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 真正需要加密的场景极少:比如你要把配置打包进离线客户端,或满足某些等保条款要求;否则,环境变量 + 权限控制(
chmod 600 .env)+ 不提交到 Git,已经覆盖 95% 的风险 - 如果真要用加密,密钥必须由外部 KMS(如 AWS Secrets Manager、HashiCorp Vault)动态获取,不能写死在代码或镜像里
-
fernet的Fernet.generate_key()每次结果不同,别把它当固定密钥存;生成后必须安全保存,丢了就彻底解不开
配置安全的核心不是技术多炫,而是让密钥生命周期清晰可控:谁创建、谁访问、谁轮换、谁审计。工具只是帮手,人盯住加载路径和权限边界,比任何加密函数都管用。









