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

如何解决Flask render_template触发Row对象无法JSON序列化问题

问题原因

该报错和render_template本身没有直接关联:Flask的请求处理流程中,视图函数返回响应后,框架会自动执行session持久化操作。默认Flask使用客户端Cookie存储session,需要将session内的所有数据序列化为JSON后签名写入Cookie,这个步骤是框架自动触发的,所以看起来报错出现在render_template调用行,实际触发点是后续的session序列化逻辑。
你排查模板参数、清空模板后仍报错,也验证了问题不在模板渲染环节:核心原因是你在本次请求的处理逻辑中,往session对象里写入了数据库查询返回的Row类型对象(比如SQLAlchemy Row、sqlite3 Row等数据库驱动返回的行结果),这类对象没有默认的JSON序列化实现,因此框架保存session时抛出对应的序列化错误。

修复方案
  • 先定位session中的非法值:在视图函数开头打印session所有键值对和对应类型,再在render_template调用前打印一次,对比找到新增的非基础类型值,即可定位到写入Row对象的代码位置。你也可以在render_template前临时添加session.clear(),如果报错消失,可100%确认是session数据导致的问题。
  • 转换数据类型后再写入session:将需要存储的Row对象转换为原生Python基础类型(字典、列表、字符串、数字等)后再存入session,参考示例:
# 错误写法:直接存入Row对象
session['current_task'] = db.session.query(Task).filter_by(id=task_id).first()

# 正确写法:仅提取需要的基础类型字段存入
task_obj = db.session.query(Task).filter_by(id=task_id).first()
session['current_task'] = {
    "id": task_obj.id,
    "task_name": task_obj.task_name,
    "activity_id": task_obj.activity_id
}
  • 特殊场景可选方案:如果确实有大量复杂对象需要存入session,可以自定义Flask的JSON序列化器,增加Row类型的序列化规则,但不推荐该方案:session存储空间有限,应该尽量只存储少量必要的基础类型数据,避免额外的性能和安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:27:04