Flask中for循环仅返回列表最后一个URL数据的问题修复求助
Flask接口仅返回最后一个URL数据的问题修复
问题描述
创建了包含多个服务URL的列表,通过Flask接口轮询这些URL的/info接口获取JSON数据,但当前代码仅返回列表最后一个URL的信息,期望展示所有URL对应的Git分支、提交ID、时间等数据。
错误原因
- 每次循环中直接赋值
data,会覆盖之前URL的结果,最终仅保留最后一次循环的内容 - 提前调用了
req_info()函数,在Flask服务启动前执行会引发错误 - 未处理请求异常(如内网HTTPS证书问题、连接超时、JSON解析失败),容易导致接口崩溃
- 非200状态码的URL未做处理,可能导致
data未定义引发报错
修复后的代码
from flask import Flask, request import requests app = Flask(__name__) urls = [ 'https://192.168.1.6:8080/info', 'https://192.168.1.5:8080/info', ] @app.route('/dev', methods=['GET']) def req_info(): # 初始化列表存储所有URL的结果 data_list = [] for url in urls: try: # 内网HTTPS通常是自签证书,添加verify=False跳过验证(根据实际情况调整) r = requests.get(url, verify=False, timeout=5) if r.status_code == 200: resp = r.json() resp_git = resp['git'] resp_git_commit = resp_git['commit'] # 拼接当前URL的信息 item = ( f"URL: {url}<br>" f"Branch: {resp_git['branch']}<br>" f"Commit: {resp_git_commit['id']}<br>" f"Time: {resp_git_commit['time']}" ) data_list.append(item) else: data_list.append(f"URL: {url}<br>请求失败,状态码: {r.status_code}") except Exception as e: # 捕获所有请求相关异常,避免接口崩溃 data_list.append(f"URL: {url}<br>请求异常: {str(e)}") # 用两个换行分隔不同URL的结果 return '<br><br>'.join(data_list) if __name__ == '__main__': app.run()
修复说明
- 结果累加:用列表
data_list存储每个URL的结果,最后通过join合并,避免覆盖之前的内容 - 移除无效调用:删除了提前执行的
req_info(),该调用在Flask服务未启动时执行会报错 - 异常处理:添加
try-except捕获请求异常,包括证书问题、超时、JSON解析错误等,保证接口稳定 - 状态码处理:对非200状态码的URL添加提示信息,避免遗漏异常情况
- 简化解析:使用
r.json()直接解析响应JSON,比json.loads(r.text)更简洁高效 - 格式优化:用
<br><br>分隔不同URL的结果,符合期望的展示格式
内容的提问来源于stack exchange,提问作者kotich-io
相关产品推荐
相关产品推荐

