python jinja2中的转义引号

fzsnzjdm  于 2023-01-29  发布在  Python
关注(0)|答案(5)|浏览(375)

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

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

然后在script标签中导入上面的jinja2文件
注意:_(“文本”)用于替换为翻译文本,因此()中的文本将替换为其他语言的文本,因此我无法预测翻译是否包含双引号
知道如何转义传入的引号并将其转换为例如“

已编辑
解决方案:

对我们来说,这个问题的解决方案是让python经过所有的翻译并转义所有的qoutations。但我们总是要确保至少英语文本不会有问题,无论如何,我们已经控制了这一点...到目前为止:)

请同时查看此文档

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

bihw5rsg

bihw5rsg1#

Jinja2从2.9版本开始有一个很好的过滤器,如果你从字符串创建json,它会生成一个用双引号“"括起来的字符串。你可以安全地在javascript中使用它。而且你不需要自己加上引号。

string = {{ html_string|tojson }};

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

jsObject = {{ py_dict|tojson }};

tojson转义引号",并通过转义<>&'等重要符号来防止XSS。

t = jinja2.Template('{{s|tojson}}')
r = t.render(s="""</script>"...'""")
print(r) # "\u003c/script\u003e\"...\u0027"
r7xajy2e

r7xajy2e2#

flask中,有一个名为tojson的默认过滤器,您可以使用它,或者使用普通的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\""
}
aoyhnmkz

aoyhnmkz3#

我不清楚这个问题。如果用单个反斜杠转义不起作用,那么也用反斜杠转义

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

gpnt7bae4#

过滤器是按顺序应用的,所以假设变量sometext中有文本,就可以执行类似这样的操作:

{{sometext|replace('"',"'")|safe}}

这将在将字符串标记为安全之前应用replace。请记住,您必须信任字符串的来源以避免漏洞。

xe55xuns

xe55xuns5#

如果你需要转义javascript中的HTML,jinja2也有转义过滤器,它可以将&,〈,〉,',和“翻译成实体,这样你就可以在提示符中编辑html代码。

相关问题