内容简介:在上面的例子中,我们视图函数向客户端返回一行HTML代码。当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户界面的分离。为了实现动态的生成HTML数据,我们需要借助模板引擎。Flask默认使用的模板引擎是Jinja2,它是一个功能齐全的Python模板引擎。首先我们创建一些数据用于测试显示效果:
在上面的例子中,我们视图函数向客户端返回一行HTML代码。当有大量HTML代码的时候,我们应该将它们都存储在一个文件里面,从而让控制器和用户界面的分离。为了实现动态的生成HTML数据,我们需要借助模板引擎。
Flask默认使用的模板引擎是Jinja2,它是一个功能齐全的 Python 模板引擎。
2.模板基本用法
2.1 创建模板
首先我们创建一些数据用于测试显示效果:
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'},
]
复制代码
创建一个watchlist.html作为模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{ user.username }}'s Watchlist</title>
</head>
<body>
<a href="{{ url_for('index') }}">← Return</a>
<h2>{{ user.username }}</h2>
{% if user.bio %}
<i>{{ user.bio }}</i>
{% else %}
<i>This user has not provided a bio.</i>
{% endif %}
{# Below is the movie list (this is comment) #}
<h5>{{ user.username }}'s Watchlist ({{ movies|length }}):</h5>
<ul>
{% for movie in movies %}
<li>{{ movie.name }} - {{ movie.year }}</li>
{% endfor %}
</ul>
</body>
</html>
复制代码
在上面的代码中,我们可以看到Jinja2常见的三种定界符:
(1) 语句
比如if判断、for循环等:
{% ... %}
复制代码
(2) 表达式
比如字符串、变量、函数调用等:
{{ ... }}
复制代码
(3) 注释
{# ... #}
复制代码
2.2 渲染模板
渲染模板,就是执行模板中的代码,并传入所有在模板中使用的变量。
from flask import Flask, render_template
...
@app.route('/watchlist')
def watchlist():
return render_template('watchlist.html'.user=user,movies=movies)
复制代码
3.模板辅助工具
3.1 上下文
模板上下文包含了很多变量,其中包括我们调用render_template()函数时手动传入的变量以及Flask默认传入的变量。
除了在渲染时传入变量,我们也可以在模板中定义变量:
{% set navigation = [('/','Home') , ('/about','About')] %}
{% set navigation %}
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
{% endset %}
复制代码
3.1.1 内置上下文变量
标准模板全局变量
| 变量 | 说明 |
|---|---|
| config | 当前的配置对象 |
| request | 当前的请求对象,在已激活的请求环境下可用 |
| session | 当前的会话对象。在已激活的请求环境下可用 |
| g | 与请求绑定的全局变量,在已激活的请求环境下可用 |
3.1.2 自定义上下文
若多个模板都使用同一变量,那么我们可以设置一个模板全局变量。
Flask提供了一个app.context_processor装饰器,用来注册模板上下文处理函数。
@app.content_processor
def inject_foo():
foo='I am foo.'
return dict(foo=foo) #等价于 return {'foo':foo}
def inject_foo():
foo='I am foo.'
return dict(foo=foo) #等价于 return {'foo':foo}
app.content_processor(inject_foo)
使用lambda
app.content_processor(lambda: dict(foo='I am foo.'))
复制代码
当我们使用render_template()函数渲染任意一个模板时,所有使用@app.content_processor装饰器注册的模板上下文处理函数(包括Flask内置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板中。
3.2 全局对象
3.2.1 内置全局函数
Jinja2内置模板全局函数
| 函数 | 说明 |
|---|---|
| range() | 和Python中的range()用法相同 |
| lipsum(n=5,html=True,min=20,max=100) | 生成随机文本,可以在测试时用来填充页面。默认生成5段HTML文本,每段包含20-100个单词 |
| dict(**items) | 和Python中的dict()用法相同 |
Flask内置模板全局函数
| 函数 | 说明 |
|---|---|
| url_for() | 用于生成URL的函数 |
| get_flashed_messages() | 用于获取flash消息的函数 |
3.2.2 自定义全局函数
@app.template_globak()
def bar():
return 'I am bar.'
复制代码
3.3过滤器
过滤器是一些用来修改和过滤变量值的特殊函数
{{ name|title }} #对name使用title过滤器
{% filter upper %}
This text becomes uppercase.
{% endfilter %}
复制代码
3.3.1 内置过滤器
3.3.2 自定义过滤器
from flask import Markup
@app.template_filter()
def musical(s):
return s+ Markup(' ')
复制代码
3.4 测试器
测试器是一些用来测试变量或表达式,返回布尔值的特殊函数
{% if age is number %}
{{ age*365 }}
{% else %}
无效的数字。
{% endif %}
复制代码
3.4.1 内置测试器
3.4.2 自定义测试器
@app.template_test()
def baz(n):
if n == 'baz':
return True
return False
复制代码
3.5 模板环境对象
在Jinja2中,渲染行为由Jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。所以我们可以通过它来添加自定义全局对象、自定义过滤器和自定义测试器。
3.5.1 添加自定义全局对象
def bar():
return 'I am bar.'
foo = 'I am foo'
app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo
复制代码
3.5.2 添加自定义过滤器
def smiling(s):
return s+ ':)'
app.jinja_env.filters['smiling']=smiling
复制代码
3.5.3 添加自定义测试器
def baz(n):
if n == 'baz':
return True
return Fasle
jinja_env.tests['baz']=baz复制代码
以上所述就是小编给大家介绍的《Flask入门学习---初步了解模板》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- C++模板泛型入门之汉诺塔
- Flask框架从入门到精通之模板表单(二十)
- Flask框架从入门到精通之模板宏(十九)
- Flask框架从入门到精通之模板导入与继承(十八)
- SA 后缀数组入门 — Luogu P3809 【模板】后缀排序
- 有了这套算法模板,一个月从入门到 Offer,妥妥的!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Never Lost Again
[美] Bill Kilday / HarperBusiness / 2018-5-29 / USD 8.00
As enlightening as The Facebook Effect, Elon Musk, and Chaos Monkeys—the compelling, behind-the-scenes story of the creation of one of the most essential applications ever devised, and the rag-tag tea......一起来看看 《Never Lost Again》 这本书的介绍吧!