
Django 默认不读取 .env 文件,需借助 django-environ 等工具显式加载;仅修改文件并重启服务器无效,必须在 settings.py 中主动调用 environ.Env.read_env() 才能生效。
django 默认不读取 `.env` 文件,需借助 `django-environ` 等工具显式加载;仅修改文件并重启服务器无效,必须在 `settings.py` 中主动调用 `environ.env.read_env()` 才能生效。
在 Django 项目中,.env 文件是管理敏感配置(如数据库凭证、密钥)的常用方式,但许多开发者误以为只要将变量写入 .env 并重启开发服务器,Django 就会自动感知变更——实际上,Django 原生完全不支持 .env 文件解析。环境变量不会被自动加载,除非你显式集成第三方库并正确初始化。
✅ 正确做法:使用 django-environ 加载 .env
首先,安装依赖:
pip install django-environ
然后,在 settings.py 中(建议紧接 BASE_DIR 定义之后)添加以下代码:
import os import environ # 初始化 environ 实例 env = environ.Env() # 从项目根目录下的 .env 文件读取变量(确保 BASE_DIR 指向项目根路径) environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
⚠️ 注意:environ.Env.read_env() 必须在任何使用 env() 或 os.environ.get() 的配置之前调用,否则变量尚未加载,将回退到默认值或引发 KeyError。
? 验证变量是否成功加载
可在 settings.py 底部临时添加调试语句(部署前务必删除):
print("DB_NAME:", os.environ.get("DB_NAME"))
print("DEBUG:", env.bool("DEBUG", default=False))运行 python manage.py runserver 后查看终端输出,确认值与 .env 中一致。
? 使用环境变量配置 Django 设置(推荐方式)
django-environ 提供类型安全的获取方法(比 os.environ.get() 更健壮):
DEBUG = env.bool("DEBUG", default=False)
SECRET_KEY = env("SECRET_KEY")
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": env("DB_NAME"),
"USER": env("DB_USER"),
"PASSWORD": env("DB_PASSWORD"),
"HOST": env("DB_HOST", default="localhost"),
"PORT": env.int("DB_PORT", default=5432),
}
}✅ 优势:自动类型转换(如 env.int(), env.bool())、内置默认值、清晰错误提示(缺失必填变量时抛出 environ.ImproperlyConfigured)。
⚠️ 关键注意事项
- .env 文件不应提交至 Git:将其加入 .gitignore,并提供 .env.example 供团队参考。
- 开发/生产环境应使用不同 .env 文件?可传参指定路径:
environ.Env.read_env(".env.production") - 修改 .env 后,必须重启 Django 进程(runserver、Gunicorn/Uvicorn 均需重启),因为环境变量在进程启动时一次性加载。
- 若使用 python manage.py shell 或 Celery worker,同样需确保其启动时已加载 .env(通常需在对应入口脚本中重复 read_env() 调用)。
✅ 总结
让 .env 变更生效的核心逻辑是:显式加载 → 类型化读取 → 进程重启。跳过任一环节都可能导致“改了没反应”。推荐始终使用 django-environ 替代裸 os.environ,它不仅解决加载问题,还显著提升配置的可维护性与安全性。










