本地正常的Flask代码部署PythonAnywhere后出现TypeError错误求助
问题原因与解决方案
核心结论:代码存在异常处理缺陷,与依赖库无关
出现TypeError: string indices must be integers的直接原因是:你遍历的data并非预期的JSON数组,而是字符串。当for i in data遍历字符串时,i会变成单个字符,自然无法用字典索引i["market_cap_rank"]。
本地测试正常但部署到PythonAnywhere后出错,是因为服务器环境下请求CoinGecko API时可能遇到限制:
- 服务器IP被反爬机制拦截,返回错误文本/HTML页面而非预期JSON
- API请求超时或返回非200状态码的异常内容
你的代码直接假设API请求必然成功且返回正确格式,未做任何异常处理,这是代码本身的缺陷。
修复步骤
1. 校验API请求状态
在解析响应前,先确认请求是否成功:
response = requests.get(url) # 非200状态码直接抛出异常 response.raise_for_status()
2. 捕获JSON解析错误
即使状态码正常,也可能返回非JSON内容,需添加解析异常处理:
try: data = json.loads(response.text) except json.JSONDecodeError: return render_template("error.html", message="加密货币数据获取失败")
3. 验证数据类型
确保data是预期的列表类型后再遍历:
if not isinstance(data, list): return render_template("error.html", message="数据格式异常")
4. 可选:添加请求头规避反爬
给请求添加浏览器标识,降低被拦截概率:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers)
关于依赖的说明
当前错误与依赖库无关——如果缺失requests,会触发ImportError而非TypeError。只需确保PythonAnywhere环境中已安装requests(通过虚拟环境执行pip install requests即可)。
内容的提问来源于stack exchange,提问作者Kacchan
相关产品推荐
相关产品推荐

