【问题标题】:Template variable injection in JS scriptJS脚本中的模板变量注入
【发布时间】:2021-12-30 04:41:33
【问题描述】:

我在我的烧瓶应用程序中遇到了一个非常特殊的问题,试图用 Js 脚本注入模板变量,我真的不明白问题出在哪里。

我特别想注入两个变量:一个数字列表和一个字符串列表(相同长度),这样我就可以在chart.js 绘图上绘制数据。

问题是,当注入单个变量(数字列表)时,页面呈现饼图没有错误,但是当我添加第二个变量(字符串列表)时,页面变为空白。

这里是 JS sn-p:

 <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 变量什么都不做,但在声明后仍然会抛出错误。

感谢您的帮助。

【问题讨论】:

标签: javascript python flask chart.js


【解决方案1】:

参考这个 SO 答案https://stackoverflow.com/a/48237270/17798307

Flask 为此提供了一个 Jinja 过滤器:tojson 将结构转储为 JSON 字符串并将其标记为安全,以便 Jinja 不会自动转义它。

请尝试像这样声明您的变量:

var labels = {{labels | tojson}};

【讨论】:

  • 是的,我想过这样做,但我的对象不可序列化,因为它是一个列表
  • 好的。也许转储到python中的json。labels=json.dumps([str(key) for key in distribution])
  • 我用这两个列表制作了一个 python dict,现在它可以工作了。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多