Flask中Python读取环境变量报错KeyError问题求助
解决Flask读取环境变量时的KeyError问题
这问题我在开发Flask项目时碰到过好几次,咱们先搞清楚背后的原因,再一步步解决。
为什么会出现KeyError?
你用export KEY123=xxx123xxxABCxxx789设置的环境变量是终端会话级的——它只存在于当前终端进程,以及这个终端启动的子进程里。如果你的Flask脚本是从另一个终端、IDE(比如PyCharm/VSC,它们的进程独立于终端)、或者用sudo这类会重置环境的命令启动的,就会找不到这个变量,抛出KeyError。
你提到同一终端直接执行print(os.environ['KEY123'])能正常输出,那大概率是你运行Flask脚本的方式有问题:比如用了sudo切换用户,或者脚本的进程没有继承当前终端的环境变量。
安全又实用的解决方案
根据你“避免密钥提交到代码仓库”的需求,推荐下面几种方案:
1. 使用.env文件(推荐,适合开发环境)
这是Python项目存储敏感信息的标准做法,灵活又安全:
- 先安装
python-dotenv库:pip install python-dotenv - 在项目根目录创建
.env文件,写入你的密钥:KEY123=xxx123xxxABCxxx789 - 在Flask入口脚本(比如
app.py)开头加载这个文件:from dotenv import load_dotenv import os from flask import Flask # 加载.env文件中的环境变量 load_dotenv() app = Flask(__name__) # 用get()方法更安全,变量不存在时返回None,不会直接抛错 app.config['KEY'] = os.environ.get('KEY123') - 一定要把
.env加入.gitignore,防止不小心提交到仓库:
在.gitignore里加一行:.env
2. 永久设置环境变量(适合服务器部署)
如果是生产服务器,不想用.env,可以把环境变量加到用户的shell配置文件里,让它永久生效:
- 如果你用bash:编辑
~/.bashrc或~/.bash_profile,添加一行:export KEY123=xxx123xxxABCxxx789 - 如果是zsh:编辑
~/.zshrc - 执行
source ~/.bashrc(对应你的配置文件)让更改立即生效,之后新开的终端也能读取到这个变量。
3. 运行脚本时临时传递环境变量(临时测试用)
如果只是临时测试,不想修改配置文件或用.env,可以在运行脚本的命令前直接指定环境变量:
KEY123=xxx123xxxABCxxx789 python app.py
这种方式下,环境变量只在当前脚本进程中有效,不会污染全局环境。
额外提醒
- 永远不要把密钥硬编码到代码里,也不要提交到版本控制仓库,这是安全开发的基本准则。
- 用
os.environ.get('KEY123')代替直接索引os.environ['KEY123'],这样如果变量不存在,只会返回None,而不是直接抛出KeyError,你还可以给get()加默认值,比如os.environ.get('KEY123', 'default_value')。
内容的提问来源于stack exchange,提问作者Zoron
相关产品推荐
相关产品推荐

