Twilio电话树在PythonAnywhere部署失败:KeyError: TWILIO_ACCOUNT_SID
解决PythonAnywhere部署Twilio电话树的KeyError问题
问题核心
本地基于Flask+Twilio搭建的电话树系统运行正常,但部署到PythonAnywhere后出现KeyError: 'TWILIO_ACCOUNT_SID',本质是Twilio相关环境变量未被正确加载。
分步解决方案
1. 验证.env文件的正确性
- 确认
.env文件存放在/home/sapperpe/tree/目录下,内容必须是无引号的键值对格式:TWILIO_ACCOUNT_SID=你的Twilio账号SID TWILIO_AUTH_TOKEN=你的Twilio认证令牌 TWILIO_NUMBER=你的Twilio电话号码 - 通过PythonAnywhere的文件管理器检查文件是否存在,内容是否完整,无多余空格或特殊符号。
2. 修复WSGI文件的dotenv加载逻辑
当前WSGI中os.path.expanduser(path)属于冗余操作,且未验证.env文件是否存在,修改后的代码如下:
import sys import os from dotenv import load_dotenv path = '/home/sapperpe/tree' if path not in sys.path: sys.path.append(path) # 直接用绝对路径加载.env,添加存在性检查避免静默失败 env_path = os.path.join(path, '.env') if os.path.exists(env_path): load_dotenv(env_path) else: raise FileNotFoundError(f"未找到.env文件:{env_path}") from tree import app as application
3. 优化代码中环境变量的获取方式
直接使用os.environ[key]会抛出模糊的KeyError,改为os.getenv()并添加校验逻辑:
# tree.py 开头部分修改 import os from twilio.rest import Client # 获取环境变量 account_sid = os.getenv('TWILIO_ACCOUNT_SID') auth_token = os.getenv('TWILIO_AUTH_TOKEN') twilio_number = os.getenv('TWILIO_NUMBER') # 校验必要变量是否存在 if not all([account_sid, auth_token, twilio_number]): raise ValueError("缺少Twilio必要环境变量,请检查.env文件或PythonAnywhere环境配置")
4. Bash运行时的环境变量加载
如果在PythonAnywhere的bash中直接运行python tree.py,WSGI中的dotenv逻辑不会生效,需要手动加载.env:
# 进入项目目录后执行 source .env python tree.py
5. 更可靠的替代方案:使用PythonAnywhere内置环境变量
放弃dotenv,直接在PythonAnywhere控制面板配置环境变量:
- 进入Web应用页面,找到环境变量选项
- 添加
TWILIO_ACCOUNT_SID、TWILIO_AUTH_TOKEN、TWILIO_NUMBER三个变量及对应值 - 保存后重启Web应用,此时代码中
os.environ[key]可正常获取变量
内容的提问来源于stack exchange,提问作者sapperpe
相关产品推荐
相关产品推荐

