Django调用Kraken API报错string indices must be integers如何解决?
错误原因
Kraken的/0/public/Assets接口返回的JSON结构包含顶级的error和result两个字段,你直接遍历data变量时,实际遍历的是这两个字段的键名(字符串类型),自然无法读取altname属性。接口的完整返回结构示例如下:
{ "error": [], // 接口错误信息,为空则代表请求正常 "result": { "XXBT": { "altname": "XBT", "aclass": "currency", // 其余字段省略 }, // 其余资产信息省略 } }
修复方案
修改views.py中的代码如下:
from django.shortcuts import render from meal_app.models import Kraken import requests def get_krakens(request): url ='https://api.kraken.com/0/public/Assets' # 新增超时参数避免程序长时间无响应 response = requests.get(url, timeout=10) data = response.json() # 先判断接口是否返回错误 if data.get('error'): # 可自行扩展错误处理逻辑,比如前端展示错误提示 return render(request, 'krakens/kraken.html', {"error": data['error']}) # 取result下的所有资产信息遍历 asset_list = data.get('result', {}).values() for asset in asset_list: # 新增重复判断避免插入重复数据,可根据自己的需求调整 if not Kraken.objects.filter(name=asset['altname']).exists(): kraken_data = Kraken( name = asset['altname'] ) kraken_data.save() # 遍历完成后再一次查询全量数据,避免循环中重复查询浪费性能 all_krakens = Kraken.objects.all().order_by('-id') return render (request, 'krakens/kraken.html', { "all_krakens": all_krakens} )
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

