37

Django 模板系统提供了一些选项(过滤器)来转义 html 中的内容,但作为初学者,它们让我有些困惑。假设我正在按照教程制作一个简单的博客,并且博客内容需要转义 - 我相信内容,因为我是唯一一个编辑它的人。所以问题是我应该像{{ post.content|autoescape }}, {{ post.content|escape }}, 还是{{ post.content|safe }}在 html 中那样做?

谢谢

编辑:我应该使用哪个过滤器将特殊字符自动转换为 html 实体?

编辑2:我刚刚意识到自动转义不是一个有效的过滤器。

4

4 回答 4

50

HTML 转义在 Django 模板中默认开启。

Autoescape 是一个标签。不是过滤器:

{% autoescape on %}
    {{ post.content }}
{% endautoescape %}

'escape' 过滤器对字符串的 HTML 进行转义。具体来说,它进行了以下替换:

  • < 转换为&lt;
  • > 转换为&gt;
  • '(单引号)转换为&#39;
  • "(双引号)转换为&quot;
  • & 转换为&amp;

除了少数极端情况外,“force_escape”几乎与“escape”相同。

“安全”过滤器会将您的内容标记为安全,因此不会被转义(将按原样发送到浏览器)。

我应该使用哪个过滤器将特殊字符自动转换为 html 实体?

嗯,你的意思是,像转换Ã&Atilde;? 一直坚持使用 utf-8 编码并忘记那些。

于 2012-07-03T08:15:08.397 回答
28

首先,您应该转义您的内容,因为您永远不知道(即使您是输入数据的人)是否需要特殊字符(例如 <、>、 )。

您使用的语法表明您对使用转义感到不舒服:

{% autoescape on %}
    {{ content }}
{% endautoescape %}

和这个完全一样

{{ content|escape }}

{{ content }}

与此 <-- 编辑完全相同:如果自动转义关闭(感谢 Paulo Scardine)

{{ content|safe }} 

安全就是这样使用:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}
于 2012-07-03T08:22:27.610 回答
10

您的问题表明您对转义是什么感到有些困惑。

转义将非安全字符(如 HTML 标记)转换为转义版本,以便脚本标记等恶意内容不会破坏您的网站。默认情况下,Django 在模板中从变量呈现的所有内容上执行此操作。

从您的评论看来,您是唯一一个编辑内容的人,您想要的是在自动转义的情况下呈现变量。因此,为此,您需要将其标记为安全。您可以在模板中执行此操作,方法是将整个批次包装在{% autoescape off %}...{% endautoescape %}标签中或通过{{ myvar|safe }}单个变量的过滤器。或者,您可以在视图中执行此操作,方法是在将mark_safe(myvar)单个变量传递给模板之前调用它们。

于 2012-07-03T08:14:36.333 回答
0

为避免转义,请使用“安全”(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe):

将字符串标记为在输出之前不需要进一步的 HTML 转义。当自动转义关闭时,此过滤器无效。

要逃避使用“转义”(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape):

转义字符串的 HTML。

于 2012-07-03T08:02:44.427 回答