我正在使用mongo.db来托管json的集合,我使用json列表将其转化为
cursor = finder.find_pokemans(db) #this just searches the db for query and works fine
all_pokemon = [k for k in cursor]
但是当我将列表传递给jinja2时,我可以使用以下行作为json列表使用它:
return render_template('index.html', list_all_pokemon = bson.json_util.dumps(all_pokemon))
我的html模板中的这一行(我正在使用内联js)
var all_pokemon = {{ list_all_pokemon }};
变成
var all_pokemon = [{"_id": {"$oid": "5ca40f82f2463129878bdd93"}, "id": 1, "name": "Bulb
换句话说,它转义了我所有的引号,因此它不能用作json。 我尝试在列表理解行中进行jsonifying,并在传递的变量中尝试了json.dumps,但出现此错误:
TypeError: Object of type ObjectId is not JSON serializable
有关如何解决此问题的任何线索?
编辑:我可以使用
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
return json.JSONEncoder.default(self, o)
return render_template('index.html', list_all_pokemon = JSONEncoder().encode(all_pokemon))
它将正常工作,但是我想知道为什么我不能像其他场景一样进行json.dumps或jsonify以及我是否可以在这里使用这些格式。
答案 0 :(得分:1)
{{ list_all_pokemon }}
是一个字符串-Jinja2将对所有未标记为HTML安全的字符串进行HTML转义。
您可以通过以下方法避免这种转义:{{ list_all_pokemon | safe }}
...但是,发生这种情况时,Jinja2知道如何单独执行此操作。这是做您想要的事情的正确方法:
var all_pokemon = {{ all_pokemon | tojson }};
在旧的Flask中,还需要将其标记为安全,因为它并不能为您做到这一点({{ all_pokemon | tojson | safe }}
),但我相信当前的Flask并不需要您这样做。