我通过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 = &#39;&#39;
</span>
</div>
虽然当它打印到屏幕时,HTML显示为'
而不是'
有谁知道为什么会这样?
答案 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元素或属性中。