我在烧瓶views.py
中有这个 def showpage():
...
test = [1,2,3,4,5,6]
return render_template("sample.html",test=test)
我的样本中有这个.html
<script> var counts = {{test}}; </script>
这给了我一个空的计数变量。如何获得与python中的测试列表相同的计数?
答案 0 :(得分:18)
将变量插入模板{{ test }}
时,需要使用对象表示。对于int [1,2,3,4,5,6]
的列表,它将呈现为[1, 2, 3, 4, 5, 6]
,因此它是有效的javascript数组,但此方法不是安全的复杂对象,没有类似javascript的表示,例如,test = [1,2, 3,4,5,任何]将呈现为[1, 2, 3, 4, 5, <built-in function any>]
,但这只是示例,永远不会有效。
要隐含地转换为烧瓶中的javascript对象{@ 3}}过滤器:
<script> var counts = {{ test|tojson }}; </script>
因此,如果对象是JSON可序列化的,那么所有对象都将呈现,否则模板引擎将引发异常。
您还可以将javascript代码发送到您的模板:
from flask import json
return render_template("sample.html",test=json.dumps(test))
但这不是一个好方法,它可以更好地使用也是HTML标记安全的tojson
过滤器。
我更喜欢不在模板中混合任何javascript代码,并使用ajax分割模板,javascript和javascript数据。如果这种方法很难,我宁愿使用tojson
过滤器。
答案 1 :(得分:7)
您在烧瓶视图中使用json.dumps,在javascript代码中使用JSON.parse。
在python视图中:
def showpage():
...
test = [1,2,3,4,5,6]
test = json.dumps(test)
return render_template("sample.html",test=test)
在JavaScript代码中:
<script> var counts = JSON.parse("{{ test }}"); </script>
答案 2 :(得分:3)
您也可以使用
import requests
class MyApi(object):
base_api_url = 'http://myapi.local:8000'
_token = None
def _login(self, token):
self._token = token
@property
def _auth_header(self):
if self._token is None:
raise Exception('fetch the token first!')
return {'Authorization': 'JWT {}'.format(self._token)}
def call_login(self, username, password):
response = requests.post(
'/api/login/', json={
'username': username,
'password': password,
}
)
response.raise_for_status()
self._login(response.json()['token'])
def call_list_data(self):
response = requests.post(
'/api/login/', headers=self._auth_header
)
response.raise_for_status()
return response.json()
或
{{ test|safe }}
{{ test|tojson|safe }}
过滤器将在脚本标记中使用。
答案 3 :(得分:0)
您尝试从python showpage函数返回字典,如下所示,它将起作用:
def showpage():
"""Your logic for getting the list to return """
test_dict = {"data_list": [1,2,3,4,5]}
return render_template("sample.html", test=test_dict)
答案 4 :(得分:0)
我从不喜欢使用json.dumps
。在此解决方案中,数组不是特殊情况。只需将数组和任何其他变量放入对象中即可:
Python
@app.route('/somePath')
def example():
data = {
'robotNames': ['Wall-E', 'Bender', 'Rosie']
}
return render_template('index.html', data=data)
JavaScript
<script>
var flaskData = JSON.parse('{{data | tojson | safe}}');
var robots = flaskData.robotNames;
robots.forEach(function (robot) {
console.log(robot);
});
</script>