Flask:Jinjia模板
阅读原文时间:2023年07月09日阅读:1

Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。

1.1 手动传入的变量:

  • 基本类型:{{ var }}
  • 字典类型:{{ mydic [ 'key' ] }} 或 {{ mydic.key }}
  • 列表类型:{{ mylist [ myindex ] }}
  • 对象类型:{{ myobj. somemethod() }}

1.2 全局变量:

可用的全局变量:configrequestsessiong、通过上下文管理器注册到全局变量…

1.3 过滤器:

过滤器名

说明

safe

渲染值时不转义

capitalize

把值的首字母转换成大写,其他字母转换成小写

lower

把值转换成小写形式

upper

把值转换成大写形式

title

把值中每个单词的首字母都转换成大写

trim

把值的首尾空格删掉

striptags

渲染之前把值中所有的 HTML 标签都删掉

  • 使用语法:{{ var|safe }}

  • 过滤器可以嵌套使用

  • 可以自定义过滤器

2.1 条件判断

{% if user="张三" %}
    Hello, {{ user }}!
{% elif user="李四"%}
    Hello, 李四!
{% else %}
    Hello, Stranger!
{% endif %}

判断条件兼容python语法的条件判断,另外还有Jinjia模板内置判断条件:

判断条件

说明

实例

defined/undefined

环境中是否有此变量的定义

if var is defined

none

变量是否为none

if var is none

number/string

数字、字符判断

even/odd

奇偶判断

upper/lower

大小写判断

2.2 循环

Jinjia模板的循环语法如下,但原生不支持break和continue语句,可通过扩展实现app.jinjia_env.add_extension('jinjia2.ext.loopcontrols')

<ul>
    {% for comment in comments %}
        <li>{{ comment }}</li>
    {% else %}
        <li>如果循环体为空则显示这里(可选)</li>
    {% endfor %}
</ul>

Jinjia模板中循环体内的内置函数:

变量

描述

loop.index

当前循环迭代的次数(从1开始)

loop.index0

当前循环迭代的次数(从0开始)

loop.revindex

到循环结束需要迭代的次数(从1开始)

loop.revindex0

到循环结束需要迭代的次数(从0开始)

loop.first

若是第一次迭代,则返回True

loop.last

若是最后一次迭代,则返回True

loop.length

当前循环的总长度

loop.cycle(a,b,c)

循环的从指定序列中取值

3.1 模板宏

定义单独的宏文件(macro.html)

{% macro render_comment(comment) %}
    <li>{{ comment }}</li>
{% endmacro %}

导入使用:

{% import 'macros.html' as macros %}
<ul>
    {% for comment in comments %}
        {{ macros.render_comment(comment) }}
    {% endfor %}
</ul>

3.2 模板包含

需要在多处重复使用的模板代码片段可以写入单独的文件,再引入所有模板中,以避免重复。

{% include 'common.html' %}
{% include 'common.html' ignore missing %}                #如果模板不存在,不会报错
{% include 'common.html' with/without context %}          #是否携带当前页面的上下文

3.3 模板继承

Jinja2 使用 blockendblock 指令在基模板中定义内容区块。

  • 语法:{% extends "base.html" %}

  • 同名区块直接覆盖

  • 同名区块可使用super()扩展

    {% extends "base.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
    {{ super() }}

    {% endblock %}
    {% block body %}

    Hello, World!

    {% endblock %}

函数

说明

url_for()

构建URL

get_flashed_messages()

获取闪现消息

range()

同python中的range函数

dict()

同python中的dict函数

cycler(* items)

常用于CSS类名的循环

5.1 模板注释:

模板注释的语法:{{# ... #}},模板注释不会出现在HTML文档中,HTML注释会。

5.2 除HTML文档中多余的空白:

在模板标签的开始或结束添加一个 -

{%- for comment in comments %}
    <li>{{ comment }}</li>
{% endfor -%}

5.3 使用变量:

设置变量:{{% set a,b=(1,2) %}}

使用with实现变量的块级作用域:

{{% with %}}
    {{% set a,b=(1,2) %}}
    ...只在区块内有效
{{% endwith %}}