Jinja2模板渲染REST返回JSON数组时显示空字符串问题求助
解决Flask REST服务返回带u前缀JSON导致Jinja2渲染空字符串的问题
嘿,我之前也碰到过类似的坑!你说的带u前缀的字符串其实是Python2时代的Unicode字符串标记,这玩意儿直接返回给前端或者传给Jinja2的话,模板根本认不出来,自然就显示空字符串了。咱们一步步来解决这个问题:
先搞清楚问题根源
那个u"xxx"是Python的Unicode对象字面量,不是标准的JSON格式。如果你的Flask服务直接把Python字典/列表返回(而不是用正确的JSON序列化方法),就会把这种Python特有的格式带出去。Jinja2模板拿到的要么是一堆带u的字符串,要么是没被正确解析的对象,自然读不出属性值。
解决方案
1. 用Flask自带的jsonify()返回标准JSON
别直接返回Python对象,一定要用jsonify来序列化数据,它会自动把Python对象转换成符合规范的JSON字符串,去掉那些u前缀。
举个例子,把原来的错误写法:
@app.route('/get-data') def get_data(): my_data = [{"name": u"张三", "age": 28}, {"name": u"李四", "age": 32}] return my_data # 错误:直接返回Python列表,会带u前缀
改成正确的:
from flask import jsonify @app.route('/get-data') def get_data(): my_data = [{"name": "张三", "age": 28}, {"name": "李四", "age": 32}] return jsonify(my_data) # 正确:返回标准JSON
2. 后端传数据给模板的正确姿势
如果是后端直接把数据传给Jinja2模板渲染,不需要返回JSON,直接把Python字典/列表传给render_template就行,Jinja2能直接识别这些原生对象:
from flask import render_template @app.route('/show-page') def show_page(): my_data = [{"name": "张三", "age": 28}, {"name": "李四", "age": 32}] return render_template('index.html', items=my_data)
3. 模板里正确遍历数据
确保模板的循环逻辑没问题,比如这样写:
<div class="data-list"> {% for item in items %} <div class="item"> <p>姓名:{{ item.name }}</p> <p>年龄:{{ item.age }}</p> </div> {% endfor %} </div>
别尝试去手动解析带u的字符串,那不是标准JSON,必须先在后端把数据处理干净。
4. 升级到Python3(可选但推荐)
如果你的项目还在Python2上跑,建议赶紧升级到Python3。Python3里字符串默认就是Unicode,不会出现u前缀的问题,而且Flask对Python3的支持更完善,能避免很多这类兼容性问题。
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

