You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

运行步骤

  1. 先启动APP1:运行python APP1.py,确保它在http://localhost:5000正常运行
  2. 再启动APP2:运行python APP2.py,它会在http://localhost:5001运行
  3. 触发转发流程:在浏览器或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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:58:15