应使用 os.getenv() 动态读取环境变量而非硬编码数据库连接串,配合 .env 文件本地开发(需加入 .gitignore),生产环境依赖系统级环境变量,并注意字符串类型转换、空格、特殊字符编码等细节。

用 os.getenv() 读取环境变量,别硬编码连接串
硬编码数据库连接信息(比如 "mysql://user:pass@localhost/db")是高危操作,Git 提交、日志打印、错误堆栈都可能泄露。必须改用 os.getenv() 动态读取:
import os
DB_URL = os.getenv("DATABASE_URL")
if not DB_URL:
raise ValueError("DATABASE_URL is not set")注意:它返回 None 而不是空字符串,所以用 if not DB_URL 检查比 if DB_URL == "" 更安全。
用 .env 文件本地开发,但别提交到 Git
开发时把变量写进项目根目录的 .env 文件,内容像这样:
DATABASE_URL=mysql://dev_user:dev_pass@127.0.0.1:3306/myapp SECRET_KEY=abc123然后用
python-dotenv 加载:from dotenv import load_dotenv load_dotenv() # 自动找 .env 并加载关键点:
.env 必须加进 .gitignore;生产环境不依赖它,只靠系统级环境变量。
生产环境优先用系统级环境变量,别依赖 .env
在服务器或容器里,直接通过系统设置环境变量:
# Linux / Docker export DATABASE_URL="mysql://prod_user:real_pass@db:3306/myapp"
# Docker Compose environment: - DATABASE_URL=mysql://...此时
load_dotenv() 不起作用(除非显式传 override=True),因为系统变量优先级高于 .env。别指望 .env 在生产生效——它只是本地便利,不是部署方案。
避免常见陷阱:大小写、空格、引号和类型转换
os.getenv() 返回的永远是字符串,即使你写了 DEBUG=true,它也是 "true" 而不是布尔值,得手动转:
DEBUG = os.getenv("DEBUG", "false").lower() == "true"还有几个高频翻车点:- Windows 下用
set DATABASE_URL=...设置的变量,重启终端才生效 -
.env里等号前后不能有空格:KEY = value会读成KEY(带空格键名) - 密码含特殊字符(如
@、/)要 URL 编码,否则SQLAlchemy解析失败 - 不同 shell(bash/zsh/fish)对引号处理不一致,
.env里尽量不加引号


















