跨度元素未将 ' 替换为撇号
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 = &#39;&#39;
</span>
</div>
虽然当它打印到屏幕时 HTML 显示为 '
而不是 '
有人知道为什么会这样吗?
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 元素或属性。
我在 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 显示为 '
而不是 '
有人知道为什么会这样吗?
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 元素或属性。