为什么在jinja2 Python中使用“| safe”

时间:2018-02-25 15:52:22

标签: python flask jinja2

我正在关注他在jinja2模板中使用“| safe”的Flask教程。为什么我们需要这个管道符号并且安全?

不使用safe,它会打印所有html标签。

使用| safe,它会显示正确的格式。为什么这样做?

以下是jinja2代码:

{% extends "layout.html" %}

{% block body %}
    <h1>{{article.title}}</h1>
    <small>Written by {{article.author}} on {{article.create_date}}</small>
    <hr>
    <div>
        {{article.body | safe}}
    </div>
{% endblock %}

2 个答案:

答案 0 :(得分:2)

使用| safe Jinja2会在变量中打印符号,这意味着它不会将“危险”符号转换为html实体(Jinja2默认会将其转换为“危险”符号)。如果您信任变量的内容,请使用此选项,因为在相反的情况下可能存在漏洞,例如XSS

答案 1 :(得分:2)

来自DOCS

  

从模板生成HTML时,变量将始终存在影响生成的HTML的字符的风险。有两种方法:

     
      
  • 手动转义每个变量;或
  •   
  • 默认情况下会自动转义所有内容。
  •   
     

Jinja支持两者。

默认情况下自动转义所有内容模式,要将内容标记为安全,因此不需要转义,请使用过滤器:

| safe

Working with automatic escaping