一、控制语句
if
语句
{% if %} {% endif %}
for
语句
{% for item in samples %}{% endfor %}
二、宏
1、不带参数
类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。
- 定义
{% macro input() %}
<input type="text"
name="username"
value=""
size="30"/>
{% endmacro %}
- 使用
{{ input() }}
2、带参数
- 定义,支持默认参数
{% macro input(name,value='',type='text',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}
- 使用
{{ input(value='name',type='password',size=40)}}
3、宏定义在外部的使用
文件名可以自定义macro.html
{% macro input() %}
<input type="text" name="username" placeholde="Username">
<input type="password" name="password" placeholde="Password">
<input type="submit">
{% endmacro %}
在其它模板文件中先导入,再调用
{% import 'macro.html' as func %}
{% func.input() %}
三、继承
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
{% block top %} {% endblock %}
标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
子模板使用extends
指令声明这个模板继承自哪个父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
。
- 父模板:
base.html
{% block top %}
顶部菜单
{% endblock top %}
{% block content %}
{% endblock content %}
{% block bottom %}
底部
{% endblock bottom %}
- 子模板:
{% extends 'base.html' %}
{% block content %}
需要填充的内容
{% endblock content %}
模板继承使用时注意点:
- 不支持多继承。
- 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
- 不能在一个模板文件中定义多个相同名字的block标签。
- 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
四、包含
Jinja2
模板中,除了宏和继承,还支持一种代码重用的功能,叫包含(Include)
。它的功能是将另一个模板整个加载到当前模板中,并直接渲染。
示例:include
的使用
{\% include 'hello.html' %}
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound
异常,可以加上ignore missing
关键字。如果包含的模板文件不存在,会忽略这条include语句。
示例:include
的使用加上关键字ignore missing
{\% include 'hello.html' ignore missing %}
宏、继承、包含:
宏(Macro)
、继承(Block)
、包含(include)
均能实现代码的复用。继承(Block)
的本质是代码替换,一般用来实现多个页面中重复不变的区域。宏(Macro)
的功能类似函数,可以传入参数,需要定义、调用。包含(include)
是直接将目标模板文件整个渲染出来。
五、特殊变量和方法
config 对象
:config 对象
就是Flask的config对象
,也就是app.config
对象。
{{ config.SQLALCHEMY_DATABASE_URI }}
request 对象
:就是 Flask 中表示当前请求的request 对象
,request对象
中保存了一次HTTP请求的一切信息。url_for 方法
:url_for()
会返回传入的路由函数对应的URL,所谓路由函数就是被app.route()
路由装饰器装饰的函数。如果我们定义的路由函数是带有参数的,则可以将这些参数作为命名参数传入。
{{ url_for('index') }}
{{ url_for('post', post_id=1024) }}
get_flashed_messages方法
:返回之前在Flask中通过flash()
传入的信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用get_flashed_messages()
方法取出。
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}