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

如何在Flask中使用requests库POST Python对象?报错问题咨询

这绝对不是用requests POST Python对象的正确方式!

咱先直接点破问题根源:HTTP协议是基于文本或二进制数据传输的,你没法直接把一个Python自定义类的实例(比如你的PollingException对象)塞进POST请求里发送。requests库和Flask都不知道该怎么处理这种“原生Python对象”,于是就炸出了你看到的两个错误:

  • TypeError: 'PollingException' object is not iterable:requests在处理data参数时,默认会尝试迭代非字符串/字节/字典类型的数据,而你的PollingException类没实现迭代逻辑,直接触发报错。
  • Broken Pipe错误:服务器端(Flask)接收到无法解析的乱码数据,直接提前关闭了连接,导致客户端(requests)还在写数据的时候管道断了,就抛出这个错误。

那正确的姿势应该是啥样的?核心思路是把Python对象序列化成HTTP能传输的标准格式,最常用的就是JSON(安全、通用),步骤如下:

1. 给自定义类加序列化/反序列化方法

首先得让你的PollingException能转成JSON支持的字典格式,还要能从字典转回对象:

class PollingException:
    def __init__(self, error_code, message):
        self.error_code = error_code
        self.message = message

    # 把对象转成字典,方便序列化JSON
    def to_dict(self):
        return {"error_code": self.error_code, "message": self.message}

    # 从字典重新创建对象,方便Flask端解析
    @classmethod
    def from_dict(cls, data):
        return cls(data["error_code"], data["message"])

2. 改造Flask端点接收JSON数据

让Flask端点能解析JSON请求,再把数据转回PollingException对象:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/submit-exception', methods=['POST'])
def handle_exception():
    # 解析请求里的JSON数据
    json_data = request.get_json()
    if not json_data:
        return jsonify({"error": "请传入合法的JSON数据"}), 400
    
    # 把JSON字典转成PollingException对象
    try:
        exc_obj = PollingException.from_dict(json_data)
        # 这里写你的业务逻辑,比如记录日志、处理异常等
        print(f"收到异常:{exc_obj.error_code} - {exc_obj.message}")
        return jsonify({"status": "处理成功"}), 200
    except KeyError:
        return jsonify({"error": "数据格式错误,缺少必要字段"}), 400

3. 用requests发送序列化后的JSON数据

现在你可以把PollingException对象转成字典,再让requests自动帮你序列化成JSON发送:

import requests

# 创建PollingException实例
exc = PollingException(error_code=1001, message="轮询超时,未获取到数据")

# 转成字典后,用requests的json参数发送(自动序列化)
response = requests.post(
    'http://localhost:5000/submit-exception',
    json=exc.to_dict()
)

# 查看响应
print(response.status_code)
print(response.json())

额外提一句:关于pickle的坑

有人可能会想到用Python的pickle来序列化对象,但强烈不推荐在公开API里用——pickle反序列化不可信数据会导致严重的安全问题(比如执行恶意代码)。如果是完全可控的内部服务,你非要用也可以,但JSON始终是更安全、更通用的选择。

内容的提问来源于stack exchange,提问作者Ratha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:58:05