17

我正在 jinja 文件中构建一个 json 对象:

object_name = {
    property_name: "{{ _("Some Text which might have "quotes" in it")  }}"
}

然后在一个script标签中导入上面的jinja2文件

注意: _("Text") 用于替换为翻译文本,因此 () 中的文本将替换为另一种语言的文本,因此我无法预测翻译是否包含双引号

任何想法如何转义传入的引号并将它们转换为例如“

已编辑

解决方案:

对我们来说,解决这个问题的方法是让 python 遍历所有的翻译并转义所有的 qoutations。但我们总是必须确保至少英文文本不会有问题,无论如何我们都可以控制它....到目前为止:)

也看看这个文件

http://pology.nedohodnik.net/doc/user/en_US/ch-poformat.html#sec-poescapes

4

4 回答 4

9

flask中,有一个名为的默认过滤器可供您tojson使用,或者使用 plain jinja2,您可以创建自己的tojson过滤器:

>>> import json
>>> env = jinja2.Environment()
>>> env.filters['tojson'] = json.dumps
>>> tmpl = env.from_string("""\
object_name = {
    property_name: {{ _(text)|tojson  }}
}""")
>>> print tmpl.render({'_': lambda x: x, 'text': 'Some text with "Quotes"'})
object_name = {
    property_name: "Some text with \"Quotes\""
}
于 2013-07-31T02:46:53.403 回答
9

Jinja2 有很好的过滤器tojson。如果从字符串生成 json,它将生成用双引号“”括起来的字符串。您可以在 javascript 中安全地使用它。而且您不需要自己加上引号。

string = {{ html_string|tojson }};

在您的特殊情况下,在 Python 中创建 dict 然后将其转换为 javascript 对象可能更容易,只需使用

jsObject = {{ py_dict|tojson }};

tojson还通过转义重要符号来防止 XSS。在 jinja 2.10 上测试:

t = jinja2.Template('{{s|tojson}}')
r = t.render(s="</script>...")
print(t) # "\u003c/script\u003e..."
于 2018-11-18T07:29:59.693 回答
3

没有清楚地理解这个问题。如果使用单个反斜杠转义不起作用,则也使用转义反斜杠

object_name = {
    property_name: "{{ _(\\\"Some Text which might have \\\"quotes\\\" in it\\\")  }}"
}
于 2013-07-30T08:25:38.727 回答
0

如果需要在 javascript 中转义 HTML,jinja2 也有转义过滤器。例如,这会将 &、<、>、' 和 ' 转​​换为实体,因此您可以在提示符中编辑 html 代码。

于 2021-10-11T03:40:19.913 回答