空白控制

在实际输出的HTML文件中,模板中的Jinja2语句、表达式和注释会保留移除后的空行。以下面代码为例:

{% if user.bio %}
    <i>{{ user.bio }}</i>
{% else %}
    <i>This user has not provided a bio.</i>
{% endif %}

Jinja2语句中的HTML代码缩进不是必须的,只是为了增加可读性,在编写大量Jinja2代码时可读性尤其重要。

实际输出的HTML代码如下所示:

<i>{{ user.bio }}</i>

<i>This user has not provided a bio.</i>

如果想在渲染时自动去掉这些空行,可以在定界符内侧添加减号。比如,{% -endfor %}会移除该语句前的空白,同理,在右边的定界符内侧添加减号将移除该语句后的空白:

{% if user.bio  -%}
    <i>{{ user.bio }}</i>
{% else -%}
    <i>This user has not provided a bio.</i>
{%- endif %}

现在输出的HTML代码如下:

<i>{{ user.bio }}</i>
<i>This user has not provided a bio.</i>

除了在模板中使用减号来控制空白外,还可以使用模板环境对象提供的trim_blocks和lstrip_blocks属性设置,前者用来删除Jinja2语句后的第一个空行,后者用来删除Jinja2语句所在行之前的空格和制表符(tabs):

app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True

trim_blocks中的block指的是使用{% ... %}定界符的代码块,与我们前面介绍模板继承中的块无关。

需要注意的是,宏内的空白控制行为不受trim_blocks和lstrip_blocks属性控制,需要手动设置:

{% macro qux(amount=1) %}
    {% if amount == 1 -%}
        I am qux.
    {% elif amount >1 -%}
        We are quxs.
    {%- endif %}
{% endmacro %}

事实上,我们没有必要严格控制HTML输出,因为多余的空白并不 影响浏览器的解析。在部署时,我们甚至可以使用工具来去除HTML响 应中所有的空白、空行和换行,这样可以减小文件体积,提高数据传输 速度。所以,编写模板时应以可读性为先,在后面的示例程序中,我们 将不再添加空白控制的代码,并且对Jinja2语句中的HTML代码进行必 要的缩进来增加可读性。


0 Comments latest

No comments.