Bootstrap

flask之jinja2

jinja版本: jinja2.1.0

jinja2:
一.简介:
jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持。

二.语法
基本语法:
控制结构 {% %}
变量取值 {{ }}
注释 {# #}

1.变量取值 {{ }}:
jinja2模板中使用 {{ }} 语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。

<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>

2.控制结构 {% %}
2.1 if语句:

{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}

2.2 for循环:
jinja2中的for循环用于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
迭代列表:

<ul>
{% for user in users %}
<li>{{ user.username|title }}</li>
{% endfor %}
</ul>

迭代字典:

<dl>
{% for key, value in my_dict.iteritems() %}
<dt>{{ key }}</dt>
<dd>{{ value}}</dd>
{% endfor %}
</dl>

3. 模板集成 :extend和super()关键字
模板继承允许我们创建一个基本(骨架)文件,其他文件从该骨架文件继承,然后针对自己需要的地方进行修改。

3.1 extend : 继承骨架文件
3.2 block : 指定可以进行修改的区域
3.3 super() : 声明了super() 变量的block可以继承父级文件对应block的内容

'base.html'

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
{% block content %}
    <div>this is content</div>
{% endblock %}

{% block foot %}
    <div>this is foot</div>
{% endblock %}
</body>
</html>

'test.html'

{# 继承base.html文件 #}
{% extends 'base.html' %} 

{# 使用 super() 关键字继承‘base.html’中对应block的内容#}
{% block content %}
    {{ super()}}
    <div>this is content extend</div>
{% endblock %}

{# 未使用super() 关键字,不继承‘base.html’中对应block的内容#}
{% block foot %}
    <div>this is foot extend</div>
{% endblock %}

output:

this is content
this is content extend
this is foot extend

4.with关键字

限制变量的有效范围为{% with param %}与{% endwith %}之间

{% block foot %}
    {% with message=get_flashed_messages() %}
        {{ message }}
    {% endwith %}
{% endblock %}

5.过滤器:

过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。

过滤器名称    说明    
default检查变量是否存在
length 渲染时值不转义
 lower 值转换成小写形式 
 upper 值转换成大写形式 
 title字符串中每个word首字母都转换成大写 'Szc Sss'
capitalize字符串首字母都转换成大写 'Sss sss'
 trim去掉值的首尾空格
join  拼接多个字符串
 replace 字符串替换
 round 默认对数字进行四舍五入,也可以用参数进行控制
int  把值转换成整型
....

过滤器使用: 只需要在变量后面使用管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。

{{ 'abc' | upper  }}
# ABC
 
{{ 'hello world' | title  }}
# Hello World
 
{{ "hello world" | replace('world','daxin') | upper }}
# HELLO DAXIN
 
{{ 18.18 | round | int }}

6.宏 :
宏类似于Python中的函数,我们在宏中定义行为,还可以进行传递参数。
使用macro关键字定义一个宏,后面跟其宏的名称和参数

定义宏:

{% macro input(name,age=18) %}   # 参数age的默认值为18
 <input type='text' name="{{ name }}" value="{{ age }}" >
{% endmacro %}

 引用宏

<p>{{ input('daxin') }} </p>
<p>{{ input('daxin',age=20) }} </p>

 

;