You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flask视图中的数组传递至另一视图的JavaScript代码?

解决Flask传递列表到Chart.js的问题

我来帮你搞定这个问题!你遇到的核心问题是Flask模板直接渲染Python列表到HTML属性时,会被自动转成带空格的字符串,导致HTML只识别到第一个元素,而且JavaScript也没法直接把这个字符串当成数组使用。下面是两种靠谱的解决方案:

方法一:直接在JS中使用tojson过滤器(推荐)

这是最简单直接的方式,不需要借助meta标签,直接把Flask传递的Python列表通过tojson过滤器转换成合法的JavaScript数组:

修改你的pie.html中的<script>部分:

<script>
// 用tojson过滤器将Python列表转为JS可识别的数组
var labelsData = {{ labels|tojson }};
var valuesData = {{ values|tojson }};
var colorsData = {{ colors|tojson }};

new Chart(document.getElementById("pie-chart"), {
    type: 'pie',
    data: {
      labels: labelsData,
      datasets: [{
        label: "Pie Chart",
        backgroundColor: colorsData,
        data: valuesData
      }]
    },
    options: {
      title: {
        display: true,
        text: 'Pie Chart Title'
      }
    }
});
</script>

原理说明

tojson是Flask内置的模板过滤器,它会把Python的列表、字典等数据结构转换成符合JavaScript语法的JSON格式。这样渲染后的代码里,labelsData会直接是一个JS数组,不需要额外的解析步骤,完全适配Chart.js的需求。

方法二:用meta标签传递(需配合JSON解析)

如果你一定要保留meta标签的方式,需要给属性值加上引号,并使用tojson过滤器,最后在JS中用JSON.parse转换:

修改pie.html的meta标签和JS部分:

<!-- 给data属性值加上引号,并用tojson转成JSON字符串 -->
<meta id="labels_data" data-labels="{{ labels|tojson }}">
<meta id="values_data" data-values="{{ values|tojson }}">
<meta id="colors_data" data-colors="{{ colors|tojson }}">

<script>
// 将JSON字符串解析为JS数组
var labelsData = JSON.parse(document.getElementById("labels_data").dataset.labels);
var valuesData = JSON.parse(document.getElementById("values_data").dataset.values);
var colorsData = JSON.parse(document.getElementById("colors_data").dataset.colors);

// 后续Chart代码保持不变
new Chart(document.getElementById("pie-chart"), {
    type: 'pie',
    data: {
      labels: labelsData,
      datasets: [{
        label: "Pie Chart",
        backgroundColor: colorsData,
        data: valuesData
      }]
    },
    options: {
      title: {
        display: true,
        text: 'Pie Chart Title'
      }
    }
});
</script>

为什么之前的方法失效?

你之前直接写data-labels={{labels}}时,Flask会把Python列表(比如['python', 'flask'])渲染成data-labels=['python', 'flask']。HTML解析属性值时,会把空格当作属性值的结束符,所以最终只会拿到['python',这部分内容,自然只有第一个元素,而且是字符串类型,不是数组。

内容的提问来源于stack exchange,提问作者Yannick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:13:24