Flask传递Pandas DataFrame至HTML模板时'df未定义'错误求助
问题原因
你遇到的jinja2.exceptions.UndefinedError: 'df' is undefined错误,核心原因是GET请求场景下没有向模板传递df变量:
- 用户首次访问页面(或刷新页面)时发送的是GET请求,此时你的
index函数只处理了POST分支,没有返回df给模板; - 模板中直接使用了
df.columns、df.itertuples()等依赖df的代码,Jinja2找不到该变量就会抛出错误。
修复方案
有两种常用修复方式,任选其一即可:
方案1:后端统一处理GET/POST请求,传递默认DataFrame
修改Python代码,在GET请求时初始化一个空DataFrame(或按需加载默认数据),确保无论请求类型如何,都向模板传递df变量:
from flask import Flask, request, render_template import pandas as pd app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): input_message = "" df = pd.DataFrame() # 初始化空DataFrame,用于GET请求场景 if request.method == 'POST': input_message = request.form['user_input'] df = pd.read_csv('data.csv') # 统一返回模板变量 return render_template('user_input.html', user_input=input_message, df=df) if __name__ == '__main__': app.run(debug=True)
方案2:前端模板添加条件判断,避免未定义变量报错
在HTML模板中,用Jinja2的条件判断包裹表格代码,仅当df存在且非空时渲染表格:
<!--user_input.html--> <html> <body> <form action="" method="post"> <input type="text" name="user_input" value="{{ user_input }}"> <input type="submit" name="submit" value="submit"> </form> <img src="/static/plot1.png" alt="Plot Image"> <img src="/static/plot2.png" alt="Plot Image"> <!-- 添加条件判断,仅当df有效时渲染表格 --> {% if df is not none and not df.empty %} <table cellspacing="0" border="1"> <tr> {% for column in df.columns %} <th style="width:500px;">{{ column }}</th> {% endfor %} </tr> {% for row in df.itertuples() %} <tr> {% for value in row %} <td style="width:500px;">{{ value }}</td> <!-- 修复width属性的语法错误 --> {% endfor %} </tr> {% endfor %} </table> {% endif %} </body> </html>
额外提示
你的HTML模板中,<td>标签的样式width500px缺少冒号,应改为width:500px;,否则样式无法生效。
内容的提问来源于stack exchange,提问作者connor449
相关产品推荐
相关产品推荐

