JS脚本中的模板变量注入
Template variable injection in JS script
我在尝试使用 Js 脚本注入模板变量的 Flask 应用程序中遇到了一个非常奇怪的问题,我真的不明白问题出在哪里。
我专门尝试注入两个变量:数字列表和字符串列表(相同长度),以便我可以在 chart.js
绘图上绘制数据。
问题是,当注入单个变量(数字列表)时,页面呈现的饼图没有错误,但是当我添加第二个变量(字符串列表)时,页面变为空白。
这是 JS 片段:
<div class='chart'>
<canvas id="myChart" width="400" height="400"></canvas>
<script type="text/javascript">
var data = {{values}};
var labels = {{labels}};
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
labels: '# of Votes',
data: data,
backgroundColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255,1)',
'rgba(255, 159, 64, 1)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
和烧瓶:
@app.route('/test')
def test():
screener = Signals()
major_news = screener.major_news()
distribution = screener.industry_distribution(major_news)
return render_template('test.html', labels=[str(key) for key in distribution], values=[distribution[key] for key in distribution])
请记住,变量都已经过检查,并且都包含它们应该包含的内容。
在 JS 脚本中,labels
变量什么都不做,但在声明后仍然会抛出错误。
感谢您的帮助。
参考这个 SO 答案
Flask provides a Jinja filter for this: tojson dumps the structure to a JSON string and marks it safe so that Jinja does not autoescape it.
请尝试这样声明您的变量:
var labels = {{labels | tojson}};
我在尝试使用 Js 脚本注入模板变量的 Flask 应用程序中遇到了一个非常奇怪的问题,我真的不明白问题出在哪里。
我专门尝试注入两个变量:数字列表和字符串列表(相同长度),以便我可以在 chart.js
绘图上绘制数据。
问题是,当注入单个变量(数字列表)时,页面呈现的饼图没有错误,但是当我添加第二个变量(字符串列表)时,页面变为空白。
这是 JS 片段:
<div class='chart'>
<canvas id="myChart" width="400" height="400"></canvas>
<script type="text/javascript">
var data = {{values}};
var labels = {{labels}};
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
labels: '# of Votes',
data: data,
backgroundColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255,1)',
'rgba(255, 159, 64, 1)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
和烧瓶:
@app.route('/test')
def test():
screener = Signals()
major_news = screener.major_news()
distribution = screener.industry_distribution(major_news)
return render_template('test.html', labels=[str(key) for key in distribution], values=[distribution[key] for key in distribution])
请记住,变量都已经过检查,并且都包含它们应该包含的内容。
在 JS 脚本中,labels
变量什么都不做,但在声明后仍然会抛出错误。
感谢您的帮助。
参考这个 SO 答案
Flask provides a Jinja filter for this: tojson dumps the structure to a JSON string and marks it safe so that Jinja does not autoescape it.
请尝试这样声明您的变量:
var labels = {{labels | tojson}};