如何使用Jinja2对HTML进行转义,以便在JavaScript (jQuery)中将其用作字符串?
如果我使用Django的模板系统,我可以这样写:
$("#mydiv").append("{{ html_string|escapejs }}");
Django的|escapejs
filter将避开html_string
中可能破坏此代码块预期用途的内容(例如引号、特殊字符),但Jinja2似乎没有等效的过滤器(我说错了吗?)
有比从Django复制/粘贴代码更干净的解决方案吗?
发布于 2018-11-18 15:20:20
Jinja2有很好的过滤器tojson。如果你从字符串生成json,它会生成用双引号"“括起来的字符串。你可以在javascript中安全地使用它。而且你不需要自己把引号放在周围。
$("#mydiv").append({{ html_string|tojson }});
发布于 2013-09-20 01:07:29
这是一个基于Django的escapejs
过滤器,我为在Jinja2模板中使用而编写的:
_js_escapes = {
'\\': '\\u005C',
'\'': '\\u0027',
'"': '\\u0022',
'>': '\\u003E',
'<': '\\u003C',
'&': '\\u0026',
'=': '\\u003D',
'-': '\\u002D',
';': '\\u003B',
u'\u2028': '\\u2028',
u'\u2029': '\\u2029'
}
# Escape every ASCII character with a value less than 32.
_js_escapes.update(('%c' % z, '\\u%04X' % z) for z in xrange(32))
def jinja2_escapejs_filter(value):
retval = []
for letter in value:
if _js_escapes.has_key(letter):
retval.append(_js_escapes[letter])
else:
retval.append(letter)
return jinja2.Markup("".join(retval))
JINJA_ENVIRONMENT.filters['escapejs'] = jinja2_escapejs_filter
模板中的安全用法示例:
<script type="text/javascript">
<!--
var variableName = "{{ variableName | escapejs }}";
…
//-->
</script>
当variableName为str
或unicode
时。
发布于 2019-06-27 22:11:09
基于@tometzky,以下是我的Python 3版本:
_js_escapes = {
'\\': '\\u005C',
'\'': '\\u0027',
'"': '\\u0022',
'>': '\\u003E',
'<': '\\u003C',
'&': '\\u0026',
'=': '\\u003D',
'-': '\\u002D',
';': '\\u003B',
u'\u2028': '\\u2028',
u'\u2029': '\\u2029'
}
# Escape every ASCII character with a value less than 32.
_js_escapes.update(('%c' % z, '\\u%04X' % z) for z in range(32))
@register.filter
def escapejs(value):
return jinja2.Markup("".join(_js_escapes.get(l, l) for l in value))
用法完全相同。
https://stackoverflow.com/questions/12339806
复制相似问题