一、上下文
1.内置上下文变量
- config: 当前配置的对象;
- request: 当前的请求对象,在已激活的请求环境下可用;
- session:当前的会话对象,在已激活的请求环境下可用;
- g:与请求绑定的全局变量,在已激活的请求环境下可用。
2.自定义上下文
# 自定义模板上下文
@app.context_processor
def inject_info():
foo = 'I am foo.'
return dict(foo=foo)
二、全局对象
1.内置全局函数
- jinja2提供的三个常用的全局函数:
- range([start,]stop[, step]): 和python中的range()用法相同;
- lipsum(n=5, html=True, min=20,max=100): 生成随机文本(lorem ipsum),可以在测试时用来填充页面。默认生成5段HTML文本,每行包含20~100个单词;
- dict(**items): 和python中的dict()用法相同。
- Flask内置的两个全局函数:
- url_for(): 用于生成URL的函数;
- get_flashed_messages(): 用于获取flash消息的函数。
2.自定义全局函数
# 自定义全局函数
@app.template_global()
def bar():
return 'I am bar'
app.template_global() 仅能用于注册全局函数
三、过滤器
在jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递。
1.内置过滤器
- default(value, default_value='u', boolean=False): 设置默认值,默认值作为参数传入,别名为d;
- escape(s): 转义HTML文本,别名为e;
- first(seq): 返回序列的第一个元素;
- last(seq): 返回序列的最后一个元素;
- length(object): 返回变量的长度;
- random(seq): 返回序列中的随机元素;
- safe(value): 将变量值标记为安全,避免转义;
- trim(value): 清除变量值前后的空格;
- max(value, case_sensitive=False, attribute=None): 返回序列中的最大值;
- min(value, case_sensitive=False, attribute=None): 返回序列中的最小值;
- unique(value, case_sensitive=False, attribute=None): 返回序列中的不重复的值;
- striptags(value): 清楚变量值内的HTML标签;
- urlize(value, trim_url_limit=None, nofollow=False, target=None, rel=None): 将URL文本转换为可单击的HTLM链接;
- wordcount(s): 计算单词数量;
- tojson(value, indent=None): 将变换值转换为JSON格式;
- truncate(s, length=255, killwords=False, end='...', leeway=None): 截断字符串,常用于显示文章摘要,length参数设置截断的长度,killwords参数设置是否截断单词,end参数设置结尾的符号。
在使用过滤器时,列表中过滤器函数的第一个参数表示被过滤的变量值(value)或字符串(s),即竖线符号左侧的值,其他的参数可以通过添加括号传入。
2.自定义过滤器
# 自定义过滤器
@app.template_filter()
def musical(s):
return s + Markup(' ♫')
# ♫为音符的HTML实体,我们用Markup类将它标记为安全字符。
{{ name|musical }}
四、测试器
在jinja2中,测试器(Test)是一些用来测试变量或表达式,返回布尔值(True或False)的特殊函数。
1.内置测试器
- callable(object): 判断对象是否可被调用;
- defined(value): 判断变量是否已定义;
- undefined(value): 判断变量是否未定义;
- none(value): 判断变量是否为None;
- number(value): 判断变量是否是数字;
- string(value): 判断变量是否是字符串;
- sequence(value): 判断变量是否是序列,比如字符串、列表、元组;
- iterable(value): 判断变量是否可迭代;
- mapping(value): 判断变量是否匹配对象,比如字典;
- sameas(value, other): 判断变量与other是否指向相同的内存地址。
2.自定义测试器
# 自定义测试器
@app.template_test()
def baz(n):
if n == 'baz':
return True
return False
五、模板环境对象
模板环境中的全局函数,过滤器和测试器分别存储在Environment对象的globals、filters和tests属性中,这三个属性都是字典对象。除了使用flask提供的装饰器和方法注册自定义函数,我们也可以直接操作这三个字典来添加相应的函数或变量,这通过向对应字典属性中添加一个键值对实现,要在模板里使用的变量名称作为键,对应的函数对象或变量作为值。下面是几个简单的示例:
1.添加自定义全局对象
# 添加自定义全局对象
def bar():
return 'I am bar.'
foo = 'I am foo.'
app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo
2.添加自定义过滤器
# 添加自定义过滤器
def smiling(s):
return s + ':)'
app.jinja_env.filters['smiling'] = smiling
3.添加自定义测试器
def baz(n):
if n == 'baz':
return True
return False
app.jinja_env.tests['baz'] = baz