Jinja2不能在javascript / html中渲染引号或放大器;安全过滤器无法解决

时间:2013-08-07 19:12:55

标签: javascript python html flask jinja2

第一篇文章;我会尽量保持这种简短和甜蜜。

我正在尝试渲染一个编辑表单,如果这些字段的值已存在,则检测并填充输入字段。我正在使用带有jinja2的烧瓶,当我使用{{ }}打印操作符时,我的字段的双引号和&符号分别呈现为"&

捕获:这只发生在javascript函数中使用print运算符时。我一直在寻找解决方案,似乎jinja2安全过滤器可以解决这个问题,但是当我将它附加到打印值时,它会使我的所有javascript无效。

以下是代码示例:

function test() {
    var nameField=document.getElementById("thing");
    nameField.value="{{ values[0] }}";
}

'values'是一个python列表。

如果我可以添加任何内容来澄清问题,请告诉我。

1 个答案:

答案 0 :(得分:2)

safe过滤器实际上会阻止HTML转义,从而为您的问题提供解决方案。

但是你在JavaScript中遇到错误,因为你现在在双引号限制的字符串中有双引号!

假设values[0]的值是字符串:double-quote " and ampersand,您会得到:

function test() {
    var nameField=document.getElementById("thing");
    nameField.value="double-quote " and ampersand"; //trailing and ampersand causing error
}

您可以尝试通过用单引号包装的字符串"{{ values[0] }}"替换'{{ values[0] }}'来解决问题。但是,如果你的字符串包含单引号怎么办?

您可能还认为需要转义特殊字符,但是您需要使用java脚本转义(双引号变为%22)而不是python转义(双引号变为\" )。

恕我直言,问题的核心在于你使用Jinja打印代码(不是值或标记)。 当您需要动态行为时,为什么在可以拥有提供客户端动态行为的静态代码时更改JavaScript代码?

如果values[0]已经位于HTML文件的DOM中(在HTML元素的id中,或在任何其他属性中或option的{ {1}}输入),让JavaScript去获取它。如果它不在DOM中,请将其放在具有适当select的隐藏元素中。

id

并在需要时检索它。

这还有一个优点,就是将您的JavaScript代码完全与服务器端页面生成和Jinja分离:您的JavaScript仍然可以在提供正确HTML结构的单一条件下工作。您可以将JavaScript移动到`<div style="diplay:none;" id="value0">{{ value[0] }}</div>` 文件,并将其用于其他项目,以及不使用Flask / Jinja2的项目。