Flask中如何从API A多次调用API B并返回批量结果?
当然可行!
你完全找错方向啦——redirect是用来让前端浏览器跳转到另一个页面/接口的,而你需要的是在Flask后端内部主动调用API B,收集每个请求的响应后再统一返回给前端,这完全可以实现。
下面给你两种常见的实现方案:
方案一:通过HTTP请求调用外部API B(最通用)
如果API B是部署在独立服务上的(不管是不是Flask写的),用requests库直接发起HTTP请求就好,这是后端之间调用接口的标准做法:
步骤1:安装依赖
先确保你安装了requests:
pip install requests
步骤2:API A的实现代码
from flask import Flask, jsonify import requests app = Flask(__name__) # 假设API B的地址是这个,根据实际情况修改 API_B_URL = "http://your-api-b-domain/path/to/b" @app.route('/api/a', methods=['GET']) def api_a(): # 这里模拟获取条目列表,实际从你的业务逻辑里拿 items = ["item1", "item2", "item3"] status = [] for item in items: try: # 调用API B,根据API B的要求用GET/POST,传参方式也按需调整 response = requests.post(API_B_URL, json={"item": item}, timeout=10) # 可以根据响应状态码判断是否成功,或者直接返回响应内容 result = { "item": item, "success": response.status_code in (200, 201), "response": response.json() if response.ok else response.text } except requests.exceptions.RequestException as e: # 捕获请求异常(超时、连接失败等) result = { "item": item, "success": False, "error": str(e) } status.append(result) return jsonify(status) if __name__ == '__main__': app.run(debug=True)
方案二:直接调用同应用内的API B视图函数(如果API B和A在同一个Flask项目里)
如果API B是你同一个Flask应用里的视图函数,没必要走HTTP请求绕一圈,直接调用函数就行,但要注意Flask上下文的问题:
from flask import Flask, jsonify, request app = Flask(__name__) # 假设这是你的API B视图函数 @app.route('/api/b', methods=['POST']) def api_b(): item = request.get_json().get("item") # 这里写API B的业务逻辑 if item: return jsonify({"message": f"Processed {item}"}), 200 return jsonify({"error": "Missing item"}), 400 @app.route('/api/a', methods=['GET']) def api_a(): items = ["item1", "item2", "item3"] status = [] for item in items: try: # 手动创建请求上下文,因为直接调用视图函数不会自动生成 with app.test_request_context('/api/b', method='POST', json={"item": item}): # 调用API B的视图函数,拿到响应对象 response_data, status_code = api_b() result = { "item": item, "success": status_code in (200, 201), "response": response_data } except Exception as e: result = { "item": item, "success": False, "error": str(e) } status.append(result) return jsonify(status) if __name__ == '__main__': app.run(debug=True)
注意事项
- 如果你要处理大量的item,同步循环调用可能会让API A的响应时间很长,这时候可以考虑用异步任务(比如Celery)来处理,不过这属于进阶需求了,先把基础实现跑通再说。
- 记得给API B的请求加超时时间,避免某个请求卡住导致整个API A挂住。
这样实现后,前端就能拿到每个条目的处理状态,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Pranjal
相关产品推荐
相关产品推荐

