Jinja2 UndefinedError求助:页面渲染时'data'变量未定义
解决Jinja2 UndefinedError: 'data'未定义的问题
我一眼就看出问题所在了——你在GET请求加载页面的时候没有传递data变量!
让我拆解一下:当你第一次访问/playerstats时,浏览器发送的是GET请求,会触发statsget()函数,这个函数只返回了stats.html模板,完全没传data参数。但你的HTML模板里直接写了{{data.player_first_name}}和{{data.player_id}},Jinja2找不到data变量,自然就抛出UndefinedError了。而POST请求是提交表单后才触发的,这时候才会传递data,但初始加载的GET请求根本没处理这个情况。
修复方案有两种,你可以选适合自己的:
方案1:给GET路由添加默认的data参数
修改你的statsget()函数,传递一个空字典或者友好的默认值,这样模板就不会找不到变量了:
@app.route("/playerstats", methods = ["GET"]) def statsget(): # 传递空字典作为默认值,避免模板报错 return render_template("stats.html", data={})
如果想让初始页面更友好,可以设置提示性的默认内容:
return render_template("stats.html", data={"player_first_name": "请输入球员姓名查询", "player_id": ""})
方案2:在HTML模板中添加条件判断
如果你不想修改后端代码,可以在Jinja2模板里做判断,确保只有data存在时才渲染球员信息:
<button type="button" class="btn btn-outline-secondary" style="height: 40px; width: 450px; margin-top: 5px; margin-bottom: 5px; border-width: 1px; border-color:lightgrey; text-align: start;"> {% if data %} {{data.player_first_name}} {{data.player_id}} {% else %} 请输入球员姓名进行查询 {% endif %} </button>
额外的健壮性优化建议
你的POST请求里直接取r["data"][0]有风险——如果API返回的data是空数组(比如查询的球员不存在),会抛出索引越界的错误。建议加个判断逻辑:
@app.route("/playerstats", methods = ["POST"]) def statspost(): player_uri = "https://www.balldontlie.io/api/v1/players?search={}%20{}" playerinput = request.form["nm"] player_split = playerinput.split() # 处理用户只输入一个名字的情况 if len(player_split) < 2: return render_template("stats.html", data={"player_first_name": "请输入完整的姓和名", "player_id": ""}) vn = player_split[0] nn = player_split[1] r = requests.get(player_uri.format(vn, nn)).json() # 处理API未找到球员的情况 if not r.get("data"): return render_template("stats.html", data={"player_first_name": "未找到该球员", "player_id": ""}) data = { "player_id": r["data"][0]["id"], "player_first_name": r["data"][0]["first_name"] } return render_template("stats.html", data=data)
这样不仅解决了初始加载的data未定义问题,还处理了API查询不到数据和用户输入不完整的情况,让你的代码更健壮。
内容的提问来源于stack exchange,提问作者fid
相关产品推荐
相关产品推荐

