flask 不自动加载 .env 文件,需安装 python-dotenv 并在 flask 实例化前调用 load_dotenv();其默认不递归查找、不覆盖已有变量,且 flask_env/flask_debug 需启动前设置;生产环境应依赖系统变量而非 .env。

Flask 项目里不加 python-dotenv 就读不到 .env 文件
Flask 本身完全不处理 .env 文件,os.getenv() 默认只读系统环境变量,不会自动加载项目根目录下的 .env。常见错误是把 .env 往项目里一放就以为万事大吉,结果 app.config['SECRET_KEY'] 始终是 None 或报 KeyError。
必须显式引入并触发加载:
- 安装
pip install python-dotenv - 在
app.py或应用入口最顶部(早于任何app = Flask(...))调用load_dotenv() - 确保
.env文件位于load_dotenv()被调用时的当前工作目录下(通常是项目根目录)
示例位置(不是随便哪行都行):
from flask import Flask
from dotenv import load_dotenv
import os
<h1>必须放这里!不能放在 create_app() 里面,也不能在 app = Flask(...) 之后</h1><p>load_dotenv() # ← 关键一步</p><p>app = Flask(<strong>name</strong>)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') # 现在能读到了
</p>
load_dotenv() 的路径和覆盖行为容易踩坑
load_dotenv() 默认只找当前工作目录(os.getcwd())下的 .env,不会递归向上查找。如果你在子目录运行 python api/main.py,它就不会加载项目根目录的 .env。
解决方式:
- 用
load_dotenv('.env')显式传入相对路径(如../.env),但硬编码路径不健壮 - 更稳妥的是用
pathlib定位项目根目录:load_dotenv(Path(__file__).parent.parent / '.env') -
load_dotenv()默认不会覆盖已存在的环境变量 —— 如果系统里已有FLASK_ENV=production,即使.env写了FLASK_ENV=development,也不会生效。需加参数override=True强制覆盖
Flask 的 ENV 和 DEBUG 不能靠 .env 自动生效
Flask 启动时(flask run)会提前读取 FLASK_ENV 和 FLASK_DEBUG 这两个变量来决定运行模式,而这个时机早于你的 Python 代码执行,所以即使你在代码里调用了 load_dotenv(),命令行启动时仍会报 Warning: Do not use the development server in a production environment 或忽略 DEBUG=True。
正确做法只有两种:
- 启动前手动导出:
FLASK_ENV=development FLASK_DEBUG=1 flask run - 或改用
python app.py启动,并在代码中设置:app.run(debug=os.getenv('DEBUG', 'False').lower() == 'true')
注意:FLASK_ENV 在 Flask 2.3+ 已被弃用,推荐直接用 FLASK_DEBUG + app.run() 控制。
生产环境别依赖 .env,配置要分层管理
.env 文件适合本地开发,但绝不能提交到 Git,也不该用于生产。Docker、K8s、云平台都通过真实环境变量注入配置(如 AWS_SECRET_ACCESS_KEY),此时 load_dotenv() 会被跳过(因为文件不存在或被忽略),os.getenv() 直接读系统变量 —— 这反而是期望行为。
关键点:
- 开发时:靠
.env提供默认值,所有配置项都用os.getenv('KEY', 'default')形式兜底 - 生产时:删掉
.env,靠部署平台注入,load_dotenv()失败也无害(python-dotenv默认静默忽略) - 敏感字段如数据库密码,永远不要写死在代码或
.env模板里;用os.getenv('DB_PASSWORD'),生产环境由运维单独挂载
最容易被忽略的是:不同环境对同一配置项的类型预期可能不同(比如 DEBUG 是布尔值,但 os.getenv() 总返回字符串),不显式转换会导致逻辑错乱。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











