如何解决Streamlit应用调用API时的TypeError: string indices must be integers错误
问题解决思路与方案
核心原因分析
直接调用函数正常,但Streamlit按钮触发时出现TypeError: string indices must be integers,说明**result变量在按钮触发时是字符串类型,而非预期的字典**。大概率是API响应解析环节出错,或Streamlit运行环境下的状态/缓存导致数据类型异常。
具体解决步骤
1. 确保API响应正确解析为字典
检查getFundamentalAnalysis函数中API请求的处理逻辑,必须使用.json()方法将JSON格式的响应转为字典,而非直接使用.text(返回字符串):
import requests def getFundamentalAnalysis(company_id): # 错误写法:返回字符串 # result = requests.get(f"your_api_url/{company_id}").text # 正确写法:解析为字典 response = requests.get(f"your_api_url/{company_id}") result = response.json() # 关键:将JSON响应转为Python字典 return result['data']['summary'][0]
2. 添加调试与异常捕获
在函数中加入打印与错误处理,明确result的类型和API返回状态:
def getFundamentalAnalysis(company_id): try: response = requests.get(f"your_api_url/{company_id}") response.raise_for_status() # 捕获4xx/5xx HTTP错误 result = response.json() print(f"Result type: {type(result)}, content: {result}") # 终端查看调试信息 return result['data']['summary'][0] except requests.exceptions.RequestException as e: print(f"API请求错误: {e}") return None except KeyError as e: print(f"数据结构异常,缺失键: {e}") return None
3. 检查Streamlit缓存(若使用)
如果函数加了@st.cache_data或@st.cache_resource装饰器,可能因缓存序列化问题导致字典被转为字符串。可以:
- 清除Streamlit缓存(终端按
C键) - 调整缓存参数,确保返回的字典能正确序列化:
import streamlit as st @st.cache_data(show_spinner=False) def getFundamentalAnalysis(company_id): # 函数逻辑不变
4. Streamlit按钮回调的容错处理
在按钮触发逻辑中,处理函数返回的空值,避免前端报错:
import streamlit as st company_id = st.text_input("输入企业ID") if st.button("Get Data"): if company_id: data = getFundamentalAnalysis(company_id) if data: st.write("查询结果:") st.json(data) # 用st.json更友好展示字典数据 else: st.error("数据获取失败,请检查企业ID或API状态") else: st.warning("请先输入企业ID")
验证方法
点击按钮后查看终端输出的调试信息:
- 如果
Result type是<class 'dict'>,说明解析正常,需检查数据结构是否与预期一致(比如['data']['summary']是否存在且是列表) - 如果
Result type是<class 'str'>,说明API返回的不是合法JSON(比如错误页面),需检查API请求参数或接口状态
内容的提问来源于stack exchange,提问作者Vlogs
相关产品推荐
相关产品推荐

