内容简介:在上面的例子中,我们视图函数向客户端返回一行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,妥妥的!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。