You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Heroku部署Python Discord机器人时出现KeyError: 'data'报错如何解决

问题成因
  • 接口鉴权失败:本地运行时配置的API密钥、身份凭证等环境变量未同步到Heroku,请求被加密货币API服务商拒绝,返回的错误响应结构中不存在data字段
  • IP访问限制:你所使用的API服务开启了IP白名单校验,本地网络IP已加入白名单可正常请求,而Heroku worker的动态出口IP未被放行,请求被拦截返回非预期结构
  • 网络连通异常:Heroku出口网络无法正常访问目标API服务(比如API域名被区域封禁、Heroku IP段被API服务商拉黑),返回错误页面而非标准JSON结构
  • 代码执行时机错误:你调用接口获取data的代码写在crypto_functions.py的顶级作用域,模块被导入时就会立刻执行,此时Heroku的运行环境还未完成初始化,导致请求失败
解决方法
  • 第一步先打印响应内容定位问题:在报错的JSON解析代码前增加调试逻辑,输出完整的请求状态和返回内容,确认异常原因:
# 原有请求代码后新增以下内容
print(f"请求状态码:{response.status_code}")
print(f"接口返回内容:{response.text[:500]}") # 打印前500个字符避免日志过长
json_data = json.loads(response.text)
if 'data' not in json_data:
    raise RuntimeError(f"接口返回结构异常,实际内容:{json_data}")
json_file = json_data['data']

重新部署后查看Heroku日志即可明确是鉴权失败、网络错误还是结构变更问题

  • 第二步同步环境变量:进入Heroku应用后台的「Settings」页面,找到「Config Vars」板块,将本地所有用到的API密钥、配置项全部按键值对格式添加到Heroku配置中,不要硬编码凭证到代码里
  • 第三步调整代码执行逻辑:将顶级作用域的接口请求代码迁移到对应的工具函数内部,仅在实际需要调用接口时才发起请求,避免导入模块时就触发请求
  • 第四步增加异常兼容处理:给接口请求逻辑增加重试和异常捕获,避免单次请求失败直接导致进程崩溃:
import requests
import json
from time import sleep

MAX_RETRY = 3
retry_count = 0
json_file = None
while retry_count < MAX_RETRY:
    try:
        response = requests.get("你的API地址", headers={"Authorization": "你的API密钥"})
        response.raise_for_status() # 状态码非2xx直接抛出异常
        json_data = response.json()
        json_file = json_data['data']
        break
    except Exception as e:
        retry_count += 1
        print(f"第{retry_count}次请求失败:{str(e)},1秒后重试")
        sleep(1)
if not json_file:
    raise RuntimeError("多次请求API失败,请检查配置")

内容的提问来源于stack exchange,提问作者Wassim Maestro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:06:04