首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Jinja2的JavaScript的转义字符串?

使用Jinja2的JavaScript的转义字符串?
EN

Stack Overflow用户
提问于 2012-09-09 22:12:58
回答 4查看 21.9K关注 0票数 22

如何使用Jinja2对HTML进行转义,以便在JavaScript (jQuery)中将其用作字符串?

如果我使用Django的模板系统,我可以这样写:

$("#mydiv").append("{{ html_string|escapejs }}");

Django的|escapejs filter将避开html_string中可能破坏此代码块预期用途的内容(例如引号、特殊字符),但Jinja2似乎没有等效的过滤器(我说错了吗?)

有比从Django复制/粘贴代码更干净的解决方案吗?

EN

回答 4

Stack Overflow用户

发布于 2018-11-18 15:20:20

Jinja2有很好的过滤器tojson。如果你从字符串生成json,它会生成用双引号"“括起来的字符串。你可以在javascript中安全地使用它。而且你不需要自己把引号放在周围。

$("#mydiv").append({{ html_string|tojson }});
票数 18
EN

Stack Overflow用户

发布于 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为strunicode时。

票数 15
EN

Stack Overflow用户

发布于 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))

用法完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12339806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档