Flask--jinjia2模板

今天学了下jinjia2模板的使用


使用render_template渲染模板


@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 %}

.可以用引用字典或者列表中的某一项。

顺便学习了下jinjia2模板中的语法

{# 我是注释 #}
{# 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(' ♫')

有三种方式

  1. 使用app.add_template_filter(xxx)来注册
  2. app.jinjia_env.filter['xxx'] = xxx
  3. 使用@app.template_filter()装饰器

html显示:


Flask--jinjia2模板_第1张图片
图片.png

测试器


测试器就是用来测试变量和表达式的。

代码:

测试器


age是什么类型: {% if age|default(365) is number %} age是数字 {% else %} age不是数字 {% endif%}

{% if name|default('xiaoming') is xiaoming %} 是小明 {% endif %}

一些其他内置测试器:string ,none,unfined,defined,iterable

  • number就是一个测试器,判断变量是不是数字
  • 同样既然有判断数字的,那就有判断字符串的,判断序列的...
Flask--jinjia2模板_第2张图片
图片.png

更过的内置测试器可以查看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 footer %} {% 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 %}
Flask--jinjia2模板_第3张图片
图片.png

结束


今天学习了一些jinjia2的基本用法,至于其他细节等以后接触到实战再来学习。

你可能感兴趣的:(Flask--jinjia2模板)