注释:
模板中的注释使用{# #}来定义,不会出现在生成的HTML中,例如:
{# 这是一个注释 #}
if 语句:
Jinja中的if语句跟Python中的if语句相似,后边的布尔值或返回布尔值的表达式将决定代码中的哪个流程会被执行:
{% if user.is_logged_in()%}
<a href=’/logout’>Logout</a>
{% else %}
<a href=’/login’>Login</a>
{% endif %}
过滤器也可以被用在if语句中:
{% if comments | length > 0%}
There are {{comments | length }} comments
{% else %}
There are no comments
{% endif %}
循环:
我们可以在Jinja中使用循环来迭代任何列表或者生成器函数:
{%for post in posts%}
<div>
<h1>{{ post.title}}</h1>
<p>{{ post.text | safe}}</p>
</div>
{% endfor %}
在循环内部,可以使用一个loop的特殊变量来获得关于for循环的一些信息。比如我们想知道当前迭代的元素序号,并模拟Python中enumerate函数做的事情,则可以使用loop变量的index属性。
{% for post in posts%}
{{ loop.index}} .{{ post.title}}
{% endfor %}
会生成这样的结果:
1 . The Title
2 . Sec Title
下边的表格列出loop对象的所有属性和方法。
变量 | 描述 |
Loop.index | 当前迭代项的序号(从1开始) |
Loop.index0 | 当前迭代项的序号(从0开始) |
Loop.revindex | 当前迭代项的逆序序号(从1开始) |
Loop.revindex0 | 当前迭代项的逆序序号(从0开始) |
Loop.first | 如果当前迭代项是迭代器中的第1个,则返回True |
Loop.last | 如果当前迭代项时迭代器中的最后一个,则返回True |
Loop.length | 迭代器的长度 |
Loop.cycle | 进行循环迭代的辅助函数 |
Loop.depth | 表示递归循环时的深度(从1开始) |
Loop.depth0 | 表示递归循环时的深度(从0开始) |
Cycle函数会在每次循环的时候,返回其参数中的下一个元素。
{% for post in posts %}
{{ loop.cycle(‘odd’,’even’)}} {{post.title}}
{% endfor %}
会输出这样的结果:
odd The Title
even Sec Title
宏:
对宏(macro)最合适的理解是把它看作Jinja中的一个函数,它会返回一个模板或者HTML字符串。为了避免反复地编写同样的模板代码,可以把它们写成函数以进行重用。例如下边的宏可以在你的模板中添加一个带有label标签且使用Bootstrap CSS的输入框:
{% macro input(name,label,value=’’,type=’text’) %}
<div class=”form-group”>
<label for”{{name}}”>{{label}}</label>
<input type=”{{type}}” name=”{{ name }}”
value=”{{ value | escape}}” class=”form-control”>
</div>
{% endmacro%}
现在可以通过调用这个宏,快速创建一个表单中的输入框:
{{ input(‘name’,’Name’)}} 相当于调用这个函数
<div class=”form-group”>
<label for”name”>Name</label>
<input type=”text” name=”Name”
value=”” class=”form-control”>
</div>
Flask特有的变量和函数
Config:
可以在模板中直接访问Flask当前的config对象:
{{ config.SQLALCHEMY_DATABASE_URI}}
sqlite:///database.db
request:
就是Flask中代表当前请求的request对象:
{{ request.url}}
http://127.0.0.1/
session:
Flask中当前的session对象:
{{session.new}}
True
url_for():
url_for会根据传入的路由函数名,返回该路由对应的URL。在模板中始终使用url_for()就可以安全地修改路由绑定的URL,而不必担心模板中渲染出错的链接:
{{url_for(‘home’)}}
/
如果我们定义的路由URL是带有参数的,则可以把它们作为关键字参数传入url_for()。Flask会把它们填充进最终生成的URL中。
{{url_for(‘post’,post_id=1)}}
get_flashed_messages()
这个函数会返回之前在Flask中通过flash()传入的消息的列表。flash函数的作用很简单,可以把由Python字符串表示的消息加入一个消息队列中,再使用 get_flashed_message函数取出它们并消费掉:
{% for message in get_flashed_messages()%}
{{message}}
{% endfor %}