美文网首页flask学习
Flask--jinjia2模板

Flask--jinjia2模板

作者: 你就像只铁甲小宝 | 来源:发表于2019-02-14 10:38 被阅读1次

今天学了下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列表传入到了模板里面。

然后在模板中通过{{ 变量 }}来显示这些内容

<h2>{{ user.username }}</h2>
{% if user.bio %}
<i>{{ user.bio }}</i>
{% else %}
    <i>This user has not provided a bio.</i>
{% endif %}
<h5>{{ user.username }}'s Watchlist ({{ movies|length }}):</h5>
<ul>
    {% for movie in movies %}
        <li>{{ movie.name }} - ({{ movie.year }}):</li>
    {% endfor %}
</ul>

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

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

{# 我是注释 #}
{# if 语句 #}
{% if xxxx %}
{% else %}
{% endif %}
{# for语句 #}
{% for x in xxx %}
{% endfor %}

过滤器


过滤器是一些可以修改变量值的特殊函数

<h3>过滤器</h3>
<hr>
    <p>返回序列第一个元素first:{{ movies|first }}</p>
    <p>返回序列最后一个元素last:{{ movies|last }}</p>
    <p>返回序列的长度length:{{ movies|length }}</p>
    <p>返回血猎中随机元素:{{ movies|random }}</p>
    <p>hello,{{name|default('陌生人')|title }}</p>
    <p>自定义过滤器musical:{{name|default('abcd')|musical}}</p>
  • 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(' &#9835;')

有三种方式

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

html显示:


图片.png

测试器


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

代码:

<h3>测试器</h3>
<hr>
    <p>age是什么类型:
    {% if age|default(365) is number %}
        age是数字
    {% else %}
        age不是数字
    {% endif%}
    </p>
    <p>{% if name|default('xiaoming') is xiaoming %}
            是小明
        {% endif %}
    </p>
    <p>一些其他内置测试器:string ,none,unfined,defined,iterable</p>
  • number就是一个测试器,判断变量是不是数字
  • 同样既然有判断数字的,那就有判断字符串的,判断序列的...
图片.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
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% block head %}
    <title>{% block title %}template-helloflask{% endblock %}</title>
    {% endblock %}
</head>
<body>
<nav>
    <ul><li><a href="{{ url_for('index')}}">Home</a></li></ul>
</nav>
<main>
    {% block content %}{% endblock %}
</main>
<footer>
    {% block footer %}
    {% endblock %}
</footer>
{% block scripts %}{% endblock %}
</body>
</html>

里面分别有 头部,标题,主要内容,底部,脚本的块。

然后我在创建一个extends_base.html来继承者基本模板。
代码:

{% extends 'base.html' %}
{% from '_macros.html' import qux%}

{% block head %}
<link rel="icon" type="image/x-icon" href="{{url_for('static',filename='weights.ico')}}">
{% endblock %}
{% block content %}
<h1>Template</h1>
<ul>
    <li><a href="{{ url_for('watchlist') }}">watchlist</a></li>
    <li>filter:{{ name|default('131212')|musical }}</li>
    <li>global: {{ bar() }}</li>
    <li>test:{% if name|default('xiaoming') is xiaoming %} i am xiaoming.{% endif %}</li>
    <li>{{qux(amount=5)}}</li>
</ul>
<h3>静态文件</h3>
<hr>
<img src="{{url_for('static',filename='timg.jpg')}}" alt="加载失败" width="50%" height="50%">
{% endblock %}
{% block footer %}
{{ super()}}
    <p>追加内容到base模块中</p>
{% 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%}
<h3>page not found</h3>
<p>you are lost......</p>
{% endblock %}
图片.png

结束


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

相关文章

  • Flask--jinjia2模板

    今天学了下jinjia2模板的使用 使用render_template渲染模板 然后在templates文件夹下面...

  • 领导力培训和发展行业的电子学习模板

    模板一: 模板二: 模板三: 模板四: 模板五: 模板六: 模板七: 模板八: 模板九: 模板十: 模板十一: 模...

  • 有了这套画册模板设计之路不再迷茫!超赞!

    indesign模板介绍 时尚写真画册模板、婚礼画册模板、摄影写真画册模板、 人物展示画册模板、服装展示画册模板;...

  • 08_模板层补充

    模板层 一、模板层导入与继承 模板导入: 先码一个好看的模板 语法:{% include '模板名称' %} 模板...

  • 《PHP Learning》模板引擎

    《PHP Learning》模板引擎 模板处理使用正则处理模板替换规则保存模板编译结果 模板使用 自定义模板引擎 ...

  • C++模板编程/泛型编程

    模板分类 模板分为函数模板与类模板两类。 函数模板 模板声明 模板定义 例如 函数模板实参类型不一致问题 参数推导...

  • 14/15

    约束模板友元 模板类的外边定义一个模板函数,在模板类中将模板函数具体化为模板类的友元函数 非约束模板友元 模板类中...

  • ★07.关于类模板

    简述 类模板:是类类型的模板,如:vector。 模板类:类模板的实例化,如:vector 。 类模板的模板参数无...

  • 【C++】C++学习笔记之十六:模板特化

    模板特化分为两种: 模板全特化 模板偏特化 模板全特化 模板偏特化

  • thymeleaf(五) ____文本模板模式

    thymeleaf中的三个文本模板 text模板,javascript模板,css模板是文本模板.而thymel...

网友评论

    本文标题:Flask--jinjia2模板

    本文链接:https://www.haomeiwen.com/subject/kfuseqtx.html