如何在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
相关产品推荐
相关产品推荐

