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}};