今天学了下jinjia2模板的使用
@app.route('/')
def index():
return render_template('index.html')
然后在templates文件夹下面创建一个index.html文件。
@app.route('/watchlist')
def watchlist():
user = {
'username': 'Grey Li',
'bio': 'A boy who loves movies and music.',
}
movies = [
{'name': 'My Neighbor Totoro', 'year': '1988'},
{'name': 'Three Colours trilogy', 'year': '1993'},
{'name': 'Forrest Gump', 'year': '1994'},
{'name': 'Perfect Blue', 'year': '1997'},
{'name': 'The Matrix', 'year': '1999'},
{'name': 'Memento', 'year': '2000'},
{'name': 'The Bucket list', 'year': '2007'},
{'name': 'Black Swan', 'year': '2010'},
{'name': 'Gone Girl', 'year': '2014'},
{'name': 'CoCo', 'year': '2017'},
]
return render_template('watchlist.html', user=user, movies=movies)
这里把user字典和movies列表传入到了模板里面。
然后在模板中通过{{ 变量 }}来显示这些内容
{{ user.username }}
{% if user.bio %}
{{ user.bio }}
{% else %}
This user has not provided a bio.
{% endif %}
{{ user.username }}'s Watchlist ({{ movies|length }}):
{% for movie in movies %}
- {{ movie.name }} - ({{ movie.year }}):
{% endfor %}
.可以用引用字典或者列表中的某一项。
{# 我是注释 #}
{# if 语句 #}
{% if xxxx %}
{% else %}
{% endif %}
{# for语句 #}
{% for x in xxx %}
{% endfor %}
过滤器是一些可以修改变量值的特殊函数
过滤器
返回序列第一个元素first:{{ movies|first }}
返回序列最后一个元素last:{{ movies|last }}
返回序列的长度length:{{ movies|length }}
返回血猎中随机元素:{{ movies|random }}
hello,{{name|default('陌生人')|title }}
自定义过滤器musical:{{name|default('abcd')|musical}}
- first,last,length,random,title都是过滤器。
- first,last分别指返回序列的第一项,最后一项。
- random指随机返回序列的某一项。
- title就是把某个变量标题化。
代码如下:
# 注册自定义过滤器
# 还可以使用app.add_template_filter(musical)来注册
# 或者 app.jinjia_env.filters['musical'] = musical
# 自定义的过滤器会在后面添加一个音乐符号
@app.template_filter()
def musical(s):
return s + Markup(' ♫')
有三种方式
- 使用app.add_template_filter(xxx)来注册
- app.jinjia_env.filter[‘xxx’] = xxx
- 使用@app.template_filter()装饰器
html显示:
测试器就是用来测试变量和表达式的。
代码:
测试器
age是什么类型:
{% if age|default(365) is number %}
age是数字
{% else %}
age不是数字
{% endif%}
{% if name|default('xiaoming') is xiaoming %}
是小明
{% endif %}
一些其他内置测试器:string ,none,unfined,defined,iterable
- number就是一个测试器,判断变量是不是数字
- 同样既然有判断数字的,那就有判断字符串的,判断序列的…
更过的内置测试器可以查看http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-tests
代码:
# 同样可以用app.add_template_test()注册
# 或者 app.jinjia_env.tests['xiaoming'] = xiaoming
@app.template_test()
def xiaoming(name):
if name == 'xiaoming':
return True
return False
这里自定义了一个测试器,判断是不是xiaoming
局部模板可以嵌套在很多个页面中。
比如我创建了一个_banner.html,我可以在其他模板中任意位置插入_banner.html的内容。
使用的格式:
{# 使用局部模板 #}
{%include '_banner.html' %}
模板继承,就是先把一些基本的内容放在一个模板中,其他模板可以继承这个模板,在这模板的基础上覆盖,和添加内容,可以避免编写重复的代码。
比如 我创建了一个基础模板base.html
代码:
{% block head %}
{% block title %}template-helloflask{% endblock %}
{% endblock %}
{% block content %}{% endblock %}
{% block scripts %}{% endblock %}
里面分别有 头部,标题,主要内容,底部,脚本的块。
然后我在创建一个extends_base.html来继承者基本模板。
代码:
{% extends 'base.html' %}
{% from '_macros.html' import qux%}
{% block head %}
{% endblock %}
{% block content %}
Template
- watchlist
- filter:{{ name|default('131212')|musical }}
- global: {{ bar() }}
- test:{% if name|default('xiaoming') is xiaoming %} i am xiaoming.{% endif %}
- {{qux(amount=5)}}
静态文件
{% endblock %}
{% block footer %}
{{ super()}}
追加内容到base模块中
{% endblock %}
- 继承一个模板,必须在第一行写上{% extends ‘xxxx’ %}
- 然后在这个模板中,使用{% block xxx %}{% endblock %}来使用某个块。
- 想要在基础模板上加点内容可以使用{{super()}}
利用app.errorhandler装饰器自定义错误页面。
# 定义错误页面
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
然后在来编写错误页面:
{% extends 'base.html'%}
{% block title%}404 page{% endblock %}
{% block content%}
page not found
you are lost......
{% endblock %}
今天学习了一些jinjia2的基本用法,至于其他细节等以后接触到实战再来学习。