Flask使用Firebase数据库时如何实现无大括号的数据展示
问题核心成因
- 核心根源是你没有拆分字典字段,直接把整个字典对象输出到页面了:从Firebase拉取的每条记录,本身是存储7个业务字段的键值对字典,Python把字典转成字符串输出时,天生就会用大括号包裹所有键值对,直接用
{{l}}输出整个字典,自然会出现带{}的异常效果。 - 模板标签位置错误:当前
<ul>列表标签写在了循环内部,会导致每一条数据生成一个独立的列表容器,排版会和预期的单列表多数据项的效果产生偏差。 - 逻辑漏洞:当前的GET请求分支没有给模板传递
t变量,用户第一次进入页面时,会触发Jinja模板的变量未定义报错。
可落地的修改步骤
第一步:调整路由逻辑
对原有路由做三处适配修改:
- 不管是GET还是POST请求,都给
t变量设置默认值,解决首次访问的报错问题 - 兼容Firebase无数据返回
None的场景,避免调用.values()方法时触发异常 - 把整理好的记录列表统一传入模板
调整后的路由代码:
@app.route('/satis', methods=['GET', 'POST']) def satis(): record_list = [] if request.method == 'POST': sehir=request.form['il'] yas=request.form['yas'] id=request.form['id'] kat=request.form['kategori'] gun=request.form['satisgunu'] cins=request.form['cinsiyet'] tarz=request.form['satistarzi'] db = firebase.database() db.child("names").push({"sehir": sehir,"yas":yas,"id":id,"kat":kat,"gun":gun,"cins":cins,"tarz":tarz}) todo = db.child("names").get() to = todo.val() if to: record_list = list(to.values()) return render_template('satis.html', t=record_list)
第二步:调整模板渲染逻辑
把列表容器挪到循环外部,循环时不再输出整个字典对象,而是拆分提取字典里的7个业务字段逐个输出,从根源上避免大括号出现在页面上:
调整后的模板代码:
<div class="container-fluid"> <!-- 列表容器只生成一次 --> <ul class="list-group"> {% for l in t %} <li class="list-group-item"> <!-- 拆分输出每条记录的字段,不再渲染整个字典 --> <h4>{{ l.sehir }} | {{ l.yas }} | {{ l.id }} | {{ l.kat }} | {{ l.gun }} | {{ l.cins }} | {{ l.tarz }}</h4> </li> {% endfor %} </ul> </div>
补充提示:如果存在部分字段为空的场景,可以给每个字段加兜底逻辑,比如{{ l.sehir or "未填写" }},避免页面出现空值。
内容的提问来源于stack exchange,提问作者Hemen Al Denizli
相关产品推荐
相关产品推荐

