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

Flask开发中Undefined类型无法JSON序列化的TypeError错误求助

问题原因

从报错回溯可定位核心问题:模板文件questionnaire.html第187行尝试对givenanswers变量执行tojson过滤,但你的路由函数未向模板传递该变量。Jinja2会将未定义的变量标记为Undefined类型,而Python JSON序列化器无法处理此类型,因此抛出TypeError: Object of type Undefined is not JSON serializable错误。

修复方案

调用render_template时必须显式传递givenanswers变量,且确保它是可JSON序列化的类型(如字典、列表、字符串等)。结合你的业务逻辑,可按以下方式处理:

1. 补充变量传递(基础修复)

在所有分支的render_template调用中添加givenanswers参数,初始场景可传空字典/列表:

@app.route("/aq", methods=["GET", "POST"])
def questionnaire():    
    global answers_df, merged_df, id_to_answers    
    answers_df = pd.DataFrame()     

    if request.method == "POST":        
        action = request.form.get("action")        
        new_answers = {"QID": [], "Answer1": []}        
        for key in request.form:            
            question_id = key            
            new_answers["QID"].append(question_id)            
            new_answers["Answer1"].append(request.form.get(question_id, ""))        
        new_answers_df = pd.DataFrame(new_answers)        
        answers_df = pd.concat([answers_df, new_answers_df], ignore_index=True)        
        merged_df = df_config.merge(answers_df, on='QID', how='outer',suffixes=('_load', ''))        
        if action == 'save':           
            # 补充本地保存逻辑
            pass
        # POST请求后传递处理后的答案数据
        return render_template("questionnaire.html", submitted=False, givenanswers=answers_df.to_dict('records'))
    
    # GET请求初始加载时传递空值
    return render_template("questionnaire.html", submitted=False, givenanswers={})

2. 适配回显场景(可选)

如果需要在页面加载时回显已保存的答案,可将存储的答案转换为可序列化格式后传递:

if request.method == "GET":
    # 示例:从本地文件加载已有答案
    # answers_df = pd.read_csv("saved_answers.csv")
    givenanswers = answers_df.to_dict('records') if not answers_df.empty else {}
    return render_template("questionnaire.html", submitted=False, givenanswers=givenanswers)
关键注意事项
  • 所有请求分支(GET/POST)的render_template调用都必须传递givenanswers,不能遗漏。
  • Pandas DataFrame无法直接序列化,需用to_dict()转换为Python原生数据结构后再传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:07:04