我正在嘗試使用 Web 服務器上的 Flask 從 python 發(fā)送列表到帶有 jinja 和 javascript 的客戶端。使用 json 應該很簡單。這是我的python代碼:@app.route("/demo")def demo(): basket = [{"fruit": "apple", "amount": 3}, {"fruit": "pear", "amount": 1}, {"fruit": "kiwi", "amount": 2}] return render_template("demo.html", basket=json.dumps(basket))這是一個簡化的代碼,在最終程序中,列表將是數(shù)據(jù)庫查詢的結(jié)果。jinja模板如下:{% extends "layout.html" %}{% block title %} Demo{% endblock %}{% block main %} <script> console.log('{{ basket }}'); object = JSON.parse('{{ basket }}') </script>{% endblock %}但是,javascript 返回解析錯誤:[{"fruit": "apple", "amount": 3}, {"fruit": "pear", "amount": 1}, {"fruit": "kiwi", "amount": 2}] 演示:1 Uncaught SyntaxError: Unexpected token & in JSON at position 2 at JSON.parse () at demo:54似乎雙引號 " 以某種方式轉(zhuǎn)換為 " 字符的 HTML 代碼 " 。隨后 JSON.parse 無法處理。嘗試將列表分解為兩個數(shù)組“fruit”和“amount”,同樣的錯誤。我猜客戶端不知道我正在發(fā)送 json 并且我應該將 content-type 設(shè)置為 application/json。是這樣嗎?如果是,我應該如何以及在哪里執(zhí)行此操作?在 Makozaki 的回答之后更新:將“籃子”作為 python 對象(而不是 json 對象)與 jinja for 循環(huán)結(jié)合使用,但前提是您重建單個元素的數(shù)組:<script> fruit = []; {% for item in basket %} fruit.push('{{ item["fruit"] }}') {% endfor %} console.log(fruit)</script>嘗試推送由“fruit”和“amount”組成的項目將再次包含所有轉(zhuǎn)義字符。而且,您必須重新構(gòu)建一個作為對象整體傳遞的數(shù)組,這似乎很愚蠢。關(guān)閉自動轉(zhuǎn)義也可以,但以一種意想不到的方式:<script> {% autoescape false %} object = {{ basket }}; {% endautoescape %}</script>這將準確返回傳遞的對象。但有趣的是:你必須省略雙花括號前后的單引號!(與前面的示例相反)謝謝你的靈感!
1 回答

倚天杖
TA貢獻1828條經(jīng)驗 獲得超3個贊
簡而言之object|tojson|safe,就是這樣做的方法,例如JSON Support。
<script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
添加回答
舉報
0/150
提交
取消