Span元素不替换'with撇号

时间:2018-06-14 12:14:32

标签: python flask utf-8 jinja2 codemirror

我通过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;而不是'

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

Jinja2将始终HTML escape anything you insert into a document。这包括转义引号字符,因为这些字符可以用来突破&#39; HTML属性,打开您的网站进行跨脚本攻击。

您必须将数据标记为“安全”。明确地:

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元素或属性中。