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

如何在Flask路由中调用Python类方法并返回值?跨机器请求问题

Flask路由中调用类方法并传递参数的解决方案

场景说明

机器A运行带有Flask实例的Python应用,机器B通过以下POST请求调用A的接口:

response = requests.post(url="http://127.0.0.1:5000/get_remote_data", json={"my_key":"my_value"})

你的问题是在A的路由函数中,不知道如何调用MyClass.receive_and_return_values方法并传递参数,以下是具体解决方法:

核心问题修正

原代码存在两个关键问题:

  1. 未导入Flask的request对象,无法获取POST请求的JSON数据
  2. receive_and_return_values是实例方法(带self参数),不能直接通过类名调用,需先实例化类,或修改方法类型

解决方案

方案一:实例化类调用实例方法

这是最常规的方式,适合需要维护类实例状态的场景:

from flask import Flask, request, jsonify

class MyClass:
    def receive_and_return_values(self, incoming):
        # 可根据传入的参数做自定义处理,比如提取my_key
        return {"my_return_key": f"processed_{incoming['my_key']}"}

app = Flask(__name__)

@app.route('/get_remote_data', methods=['POST'])
def get_remote_data():
    my_json = request.get_json()
    # 可选:添加参数校验,避免空数据或缺失字段
    if not my_json or "my_key" not in my_json:
        return jsonify({"error": "Invalid JSON data or missing 'my_key'"}), 400
    
    # 实例化MyClass
    my_instance = MyClass()
    # 调用实例方法并传递参数
    result = my_instance.receive_and_return_values(my_json)
    # 返回JSON格式响应
    return jsonify(result)

if __name__ == '__main__':
    # 若机器B与A不在同一台机器,需将host设为0.0.0.0,允许外部访问
    app.run(host='0.0.0.0', port=5000)

方案二:改为静态方法直接调用

如果不需要类实例的状态,可将方法改为静态方法,无需实例化即可调用:

from flask import Flask, request, jsonify

class MyClass:
    @staticmethod
    def receive_and_return_values(incoming):
        return {"my_return_key": f"processed_{incoming['my_key']}"}

app = Flask(__name__)

@app.route('/get_remote_data', methods=['POST'])
def get_remote_data():
    my_json = request.get_json()
    if not my_json or "my_key" not in my_json:
        return jsonify({"error": "Invalid JSON data or missing 'my_key'"}), 400
    
    # 直接通过类名调用静态方法
    result = MyClass.receive_and_return_values(my_json)
    return jsonify(result)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

方案三:改为类方法调用

如果需要访问类级别的属性,可使用类方法(带cls参数):

from flask import Flask, request, jsonify

class MyClass:
    # 类级别的属性
    process_prefix = "handled_"
    
    @classmethod
    def receive_and_return_values(cls, incoming):
        return {"my_return_key": f"{cls.process_prefix}{incoming['my_key']}"}

app = Flask(__name__)

@app.route('/get_remote_data', methods=['POST'])
def get_remote_data():
    my_json = request.get_json()
    if not my_json or "my_key" not in my_json:
        return jsonify({"error": "Invalid JSON data or missing 'my_key'"}), 400
    
    result = MyClass.receive_and_return_values(my_json)
    return jsonify(result)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

额外注意事项

  • 确保机器A的防火墙开放5000端口,否则机器B无法连接
  • 如果使用127.0.0.1作为监听地址,仅允许本机访问,跨机器调用必须改为0.0.0.0
  • 使用jsonify返回响应,Flask会自动设置Content-Type: application/json头,保证机器B能正确解析响应

内容的提问来源于stack exchange,提问作者Franz van der Steg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:29