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

Posted

技术标签:

【中文标题】无法将 jinja2 变量传递到 javascript 代码段中【英文标题】:Unable to pass jinja2 variables into javascript snippet 【发布时间】:2014-03-04 18:20:53 【问题描述】:

如何将 jinja2 数据传递到 javascript。 我有一个 Flask REST url 为/logs/<test_case_name> 我正在尝试使用 .getJSON() 来查询上述 URL,因此希望将具有 testcasename 的 jinja2 数据传递给 .getJSON 函数。

示例代码:

<script type="text/javascript">
  alert(name);
</script>

它不起作用。 请问有什么建议吗?

【问题讨论】:

name|safe 应该可以工作 @JakobBowyer - 它工作正常:( 将模板语言与 javascript 混合通常是个坏主意。另一种方法是使用 html 作为代理 - 将名称存储在像这样的元素中 ,然后在 javascript 中执行 djangoData = $('#my-data').data(); 【参考方案1】:

你可以试试 alert(name|safe);

【讨论】:

您好。尝试详细说明或发表评论。【参考方案2】:

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

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

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

【讨论】:

当使用更复杂的语法如JSON.parse(' url_for(\'foo.bar\', filename = \'foobar.txt\') | tojson ');时,这会给出Uncaught SyntaxError: Unexpected token in JSON at position 1 那很可能是一个错误。我的理解是过滤器是json.dumps 的包装器,不太确定,但我怀疑是否有人为此实现了 json 编码器。【参考方案3】:

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

这是最简单的方法:

var name = name|tojson;

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

【讨论】:

Escape secuence for json 等同于 javascript,但是当在 json 中添加更改时,它会损坏 javascript。为了获得更好的结果,请遵守标准:var name = JSON.parse(' name | tojson ');.【参考方案4】:

我就是这样做的

我的 html 元素

<!--Proxy Tag for playlist data-->
<meta id="my_playlist_data" data-playlist=" playlist ">

我的脚本元素

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

请参阅.data() 文档了解更多信息

【讨论】:

【参考方案5】:

除了将变量封装在字符串中,另一种方法是 jquery 以获取利润:

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

<meta id="my-data" data-name="name" data-other="other">

然后在javascript中做

var djangoData = $('#my-data').data();

这有以下优势:

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

【讨论】:

谢谢@rikAtee。我遵循相同的逻辑.. 只是我使用了普通的 div。 它有效,但是,我认为这是一个非常过分的方法 - 你的 html 文件会因数据属性而臃肿,我认为下面的答案(ndpk's)是一个更好的方法 好极了!现在我可以将 htmljavacript 完全隔离开来。这将使我能够与 Flask-Assets 进行干净的集成。谢谢! 我很难理解 html 语法与原始问题的对应关系。 data-name 是任意字符串,还是必须是 data-name?还是从data- 开始? other 变量从何而来? 我认为值得一提的是,您不能为元标记内的变量命名,所以首先我尝试了 并且因为它不起作用。所以制作像这样的变量 。从答案中必须很清楚,但由于某种原因,起初我并不清楚。【参考方案6】:

用引号试试:

alert("name");

【讨论】:

我认为如果name 包含诸如'\n'之类的换行符,这将不起作用。它会抛出一个 javascript 语法错误。

以上是关于无法将 jinja2 变量传递到 javascript 代码段中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jinja2 将值传递给 WTForms 字段

如何在 Jinja2 的变量中嵌入变量?

使用 jinja2 时如何将新条目添加到字典对象中?

使用 Flask 和 Jinja2 单击时无法加载模板 HTML [重复]

使用 Flask/Jinja2 将 HTML 传递给模板

将 Terraform 变量中的数字传递给 Ansible Playbook