Flask双应用无法连接:如何实现数据拉取与转发功能?
解决两个Flask应用的数据联动问题
我来帮你梳理下核心问题,然后给出可运行的解决方案:你的需求是让APP1提供数据,APP2拉取该数据后转发到第三方系统,但目前的代码有几个关键问题导致两者无法连通,咱们一步步调整:
原代码的核心问题
- APP1没有提供可拉取数据的GET接口:你的APP1的
/pushdata接口在GET请求时没有返回任何数据,APP2根本拿不到内容 - APP2的请求逻辑位置错误:你把请求代码写在了全局作用域,APP2启动时就会执行一次,但这时候APP1可能还没就绪,而且没有触发机制(比如通过Web请求来启动转发流程)
- APP2的
json_data是占位符,没有实际获取逻辑
修改后的完整代码
1. APP1.py:添加数据返回的GET分支
首先调整APP1,让它能通过GET请求返回需要的数据(这里用模拟数据,你可以替换成实际业务数据):
from flask import Flask, jsonify, request app = Flask(__name__) # 模拟你要提供给APP2的数据(可替换为实际业务逻辑生成的数据) business_data = { "user_id": 123, "operation": "data_sync", "payload": {"key": "value", "timestamp": "2024-05-20T10:00:00"} } @app.route('/pushdata', methods=['GET', 'POST']) def testfn(): if request.method == 'POST': # 保留原有的POST处理逻辑 req = request.get_json() print("Received POST data:", req) return 'Success!! Reached Flask', 200 # 新增GET请求分支,返回数据给APP2 elif request.method == 'GET': return jsonify(business_data), 200 if __name__ == '__main__': # 绑定0.0.0.0让APP2能访问,指定端口5000(避免和APP2冲突) app.run(host='0.0.0.0', port=5000, debug=True)
2. APP2.py:将转发逻辑放到路由中
把拉取和转发的逻辑放到Flask路由里,通过Web请求触发,同时完善异常处理:
from flask import Flask, jsonify import requests app = Flask(__name__) # 配置各服务地址 APP1_API_URL = "http://localhost:5000/pushdata" # APP1的接口地址 TARGET_SYSTEM_URL = 'http://xx.xx.xx.xxx:<PORT>/lemte/7/rest/tenten/' # 目标系统地址 TARGET_AUTH_CRED = ('XXXXX', 'YYYYY') # 目标系统的认证信息 @app.route('/forward_to_target', methods=['GET']) def forward_data(): try: # 第一步:从APP1拉取数据 app1_res = requests.get(APP1_API_URL) app1_res.raise_for_status() # 捕获HTTP请求错误(比如404、500) fetched_data = app1_res.json() print(f"从APP1获取到数据:{fetched_data}") # 第二步:将数据POST到目标系统 headers = {'content-type': 'application/json'} target_res = requests.post( TARGET_SYSTEM_URL, headers=headers, auth=TARGET_AUTH_CRED, json=fetched_data # 自动序列化JSON,比手动dumps更简洁 ) target_res.raise_for_status() target_response_data = target_res.json() # 返回成功响应 return jsonify({ "status": "success", "app1_data": fetched_data, "target_system_response": target_response_data }), 200 except requests.exceptions.RequestException as e: # 捕获所有请求相关的异常,返回错误信息方便调试 return jsonify({"status": "error", "message": str(e)}), 500 if __name__ == '__main__': # 运行在5001端口,避免和APP1的5000端口冲突 app.run(host='localhost', port=5001, debug=True)
运行步骤
- 先启动APP1:运行
python APP1.py,确保它在http://localhost:5000正常运行 - 再启动APP2:运行
python APP2.py,它会在http://localhost:5001运行 - 触发转发流程:在浏览器或Postman访问
http://localhost:5001/forward_to_target,就能看到整个流程的结果
关键注意事项
- 端口冲突:两个Flask应用不能使用同一个端口,所以我们给APP1设为5000,APP2设为5001
- 网络可达性:如果APP1和APP2不在同一台机器,APP1需要绑定
0.0.0.0,并且确保防火墙开放对应端口 - 异常处理:代码中加入了
try-except捕获请求异常,方便你排查连接失败、目标系统报错等问题 - JSON序列化:使用
requests.post的json参数自动处理序列化,比手动json.dumps更可靠,还能避免格式错误
内容的提问来源于stack exchange,提问作者Oxxodome
相关产品推荐
相关产品推荐

