Python Flask如何获取POST请求数据并解决JSON序列化报错问题
问题原因
你遇到的TypeError: Object of type type is not JSON serializable报错和请求数据解析逻辑无关,是Flask构造POST请求的响应时触发的:你当前的POST处理分支只执行了打印逻辑,没有显式返回合法的可序列化响应对象,Flask默认处理无返回值的视图函数时,会尝试对非法返回值做序列化,进而触发该错误。
解决方案
按以下步骤修改服务端代码即可:
1. 优化JSON解析逻辑(可选,方便排查解析问题)
将请求体解析逻辑替换为带参数的get_json,明确解析失败时的行为:
sentmsg = request.get_json(silent=False)
参数说明:
silent=False:JSON解析失败时直接抛出异常,方便快速定位请求格式问题- 若你未严格校验客户端
Content-Type,可添加force=True参数强制解析请求体为JSON,忽略请求头的格式声明
2. 补充POST分支的合法返回值
Flask要求所有视图函数必须返回可转为响应的对象,POST逻辑处理完成后必须显式返回JSON格式的响应。
修改后的完整服务端代码示例:
@app.route('/api/resources/messages/all', methods=['GET', 'POST']) def api_messages(): if request.method == "GET": return jsonify(messages) if request.method == "POST": sentmsg = request.get_json(silent=False) print(sentmsg) # 此处已经可以正常打印解析后的JSON字典 # 显式返回合法JSON响应 return jsonify({ "status": "success", "received_data": sentmsg }), 200
3. 客户端调试优化(可选)
客户端请求时可打印返回结果,验证数据传输是否正常:
new_data = {'msg': message, 'rec':rec_id, 'snd':my_id} resp = requests.post("http://localhost:33/api/resources/messages/all", json = new_data) # 打印服务端返回的响应内容 print(resp.json())
额外排查点
如果修改后仍报错,检查以下两个位置:
- 确认
jsonify的参数中没有传入类、函数、未实例化的对象这类不可序列化的类型 - 确认GET分支中
messages变量的内容全部为可JSON序列化的基础类型(字符串、数字、列表、字典等)
内容的提问来源于stack exchange,提问作者Luke Phillips
相关产品推荐
相关产品推荐

