无法将jinja2变量传递到javascript代码段

dee*_*ank 31 javascript python jinja2 flask

我如何将jinja2数据传递给javascript.我有一个Flask REST URL,因为/logs/<test_case_name> 我正在尝试.getJSON()查询上面的URL,因此希望传递具有testcasename .getJSON功能的jinja2数据.

示例代码:

<script type="text/javascript">
  alert({{name}});
</script>
Run Code Online (Sandbox Code Playgroud)

它不起作用.有什么建议吗?

ndp*_*dpu 50

试试报价:

alert("{{name}}");
Run Code Online (Sandbox Code Playgroud)

  • 如果`name`包含换行符,例如'\n',我认为这不起作用.它会抛出一个javascript语法错误. (6认同)

ric*_*ier 44

除了将变量封装在字符串中之外,替代方法是获取利润的jquery:

将模板语言与javascript混合通常是一个坏主意.另一种方法是使用html作为代理 - 将名称存储在像这样的元素中

<meta id="my-data" data-name="{{name}}" data-other="{{other}}">
Run Code Online (Sandbox Code Playgroud)

然后在javascript中做

var djangoData = $('#my-data').data();
Run Code Online (Sandbox Code Playgroud)

这有利于:

  • javascript不再绑定到.html页面
  • jquery隐含地强制数据

  • 我很难理解html语法如何与原始问题相对应.`data-name`是一个任意字符串,还是必须是`data-name`?或者只是从`data -`开始?`other`变量来自哪里? (2认同)
  • 我认为值得一提的是,您不能为元标记内的变量指定任何名称,所以首先我尝试了 &lt;meta id="geodata" test="{{test}}"&gt; ,因为它不起作用。因此,创建这样的变量 &lt;meta id="geodata" data-test="{{test}}"&gt;。答案一定很清楚,但由于某种原因,我一开始并不清楚。 (2认同)

小智 9

我知道这是一个有点老的话题,但由于它吸引了很多观点,我想有些人仍在寻找答案。

这是最简单的方法:

var name = {{name|tojson}};
Run Code Online (Sandbox Code Playgroud)

它会“解析”任何“名称”并正确显示它:https : //sopython.com/canon/93/render-string-in-jinja-to-javascript-variable/

  • json 的转义安全等于 javascript,但是当在 json 中添加更改时,它会损坏 javascript。为了获得更好的结果,请遵守标准:`var name = JSON.parse('{{ name | tojson }}');`。 (4认同)

Ped*_*ues 8

我只是想我会添加我最终使用的解决方案。

与其他答案相比,它有一些优点:

  • 它是模板级别 100% 有效的 javascript(没有编辑器/lint 错误)。
  • 不需要任何特殊的 HTML 标签。
  • 没有依赖项(jquery 或其他)。
let data = JSON.parse('{{ data | tojson }}');
Run Code Online (Sandbox Code Playgroud)


Sur*_*ath 5

我就是这样做的

我的 html 元素

<!--Proxy Tag for playlist data-->
<meta id="my_playlist_data" data-playlist="{{ playlist }}">
Run Code Online (Sandbox Code Playgroud)

我的脚本元素

// use Jquery to get data from proxy Html element
var playlist_data = $('#my_playlist_data').data("playlist");
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅.data()文档