我正在将文本传递到 code mirror javascript 中通过 jinja2 的文本编辑器库元素。
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 显示为 '
而不是 '
有谁知道为什么会这样吗?
最佳答案
Jinja2 永远 HTML escape anything you insert into a document 。这包括转义引号字符,因为这些字符可用于“突破” 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 元素或属性的数据。
关于python - Span 元素不将 ' 替换为撇号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50857326/