跨度元素未将 ' 替换为撇号

Span element not replacing ' with apostrophe

我在 javascript 中通过 jinja2 将文本传递到 code mirror 文本编辑器库元素。

code = `{% for line in file_content%}{{ line }}\n{% endfor %}`

//CODE MIRROR
var editor = CodeMirror(document.getElementById('code_editor'), {
    value: code,
    mode: 'python',
    theme: 'neo'
});

如果 file_content 设置为一些 Python 代码,例如 ["self._tophash = ''"] 那么这将产生以下 HTML 元素:

<div id='code_editor'>
   <span role="presentation" style="padding-right: 0.1px;">        
        self._tophash = &amp;#39;&amp;#39;
   </span>
</div>

虽然当它打印到屏幕时 HTML 显示为 &#39; 而不是 '

有人知道为什么会这样吗?

Jinja2 将始终 HTML escape anything you insert into a document。这包括转义引号字符,因为这些字符可用于 'break out' 的 HTML 属性,使您的网站容易受到跨脚本攻击。

您必须将数据明确标记为 'safe':

code = `{% for line in file_content%}{{ line|safe }}\n{% endfor %}`

就我个人而言,我会将数据插值为 JSON

code = {{ file_content|join('\n')|tojson }};

JSON 是(几乎 完全)Javascript 的一个子集; Jinja2 tojson filter 将 Python 数据编码为 JSON 的方式保证与 Javascript 兼容。

如果您使用的是 Jinja2 older than 2.10 版本(Flask 1.0 的最小版本),您仍然必须将结果标记为安全,但这没关系,因为您不会生成内插数据进入 HTML 元素或属性。