Django模板转义

use*_*412 32 django django-templates django-template-filters

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

谢谢

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

编辑2:我刚刚意识到autoescape不是一个有效的过滤器.

Pau*_*ine 45

默认情况下,Django模板中的HTML转义处于启用状态.

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

{% autoescape on %}
    {{ post.content }}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)

'escape'过滤器转义字符串的HTML.具体来说,它使这些替换:

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

'force_escape'与'escape'几乎完全相同,除了一些极端情况.

"安全"过滤器会将您的内容标记为安全,因此不会对其进行转义(将按原样发送到浏览器).

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

好吧,你的意思是,就像转换Ã&Atilde;?坚持使用utf-8编码并忘记这些.

  • @ BobStein-VisiBone在转义过滤器可能无法正常工作的地方是`<script> </ script>`,在这种情况下使用`{{value | escapejs}}` (7认同)

Blu*_*gma 22

首先,你应该逃避你的内容,因为你不需要知道(即使你是输入数据的人),如果你需要特殊的角色(比如<,>,).

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

这个

{% autoescape on %}
    {{ content }}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)

与此完全一样

{{ content|escape }}
Run Code Online (Sandbox Code Playgroud)

这个

{{ content }}
Run Code Online (Sandbox Code Playgroud)

与此< - 编辑完全相同:如果autoescape为OFF(感谢Paulo Scardine)

{{ content|safe }} 
Run Code Online (Sandbox Code Playgroud)

安全是这样使用的:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 9

你的问题表明你对逃避是什么有点困惑.

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

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