Flask模板Jinja2引擎介绍
一、Jinja2变量及函数
1、标准变量及函数
在Flask的Jinja2模板中自动引入了一些标准变量,如request,session,g,config,标准函数有url_for,get_flashed_messages。
get_flashed_messages函数会获取我们在view_func中定义的flash消息。
{% meassages=get_flashed_messages %} {{messages}}
config对象的使用就是如在Python普通类的用法:{{config.DEBUG}}
2、自定义变量
1)自定义变量
from flask import current_app
@app.context_processor def appinfo(): return dict(appname=current_app.name)
在模板中引用:{{appname}} 上面主要利用的是app装饰器,context_processor,被装饰的函数会添加到app属性emplate_context_processors中,而且构建变量上下文必须返回的是一个字典,具体源代码如下:
@setupmethod def context_processor(self, f): """Registers a template context processor function.""" self.template_context_processors[None].append(f) return f
2)自定义函数:
import time
@app.context_processor
def get_current_time():
def get_time(timeFormat="%b %d, %Y - %H:%M:%S"):
return time.strftime(timeFormat)
return dict(current_time=get_time)
在模板中引用 {{current_time()}}
另外一种方法是通过装饰器,app.template_global:
import time @app.template_global('end_with') def current_time(timeFormat="%b %d, %Y - %H:%M:%S"): return time.strftime(timeFormat)
等同于Flask中: app.jinja_env.globals['current_time'] = current_time
二、语句和表达式
1、表达式
模板的表达式都是包含在{{ }}中,表达式的用法和Python的语法比较相似:
- 表达式里可使用变量,或者Python基础类型,如字符串,整数,浮点数,列表,元祖,字典等等;
- 可以进行运算,如加减乘除,逻辑运算,比较运算 {{ 2==2 }}
- 函数调用 {{ url_for(...) }}
- in 操作 {{ "it in ['d','y','it'] }}
- 字符串连接符 ,类似于Python的 + 字符串连接符 {{ "hello" ~ "haibo" }}
- 过滤器以及测试器 {{ "HI %s " %name if name }}
2、控制语句
控制语句主要有 if条件控制语句和for循环控制语句两种,定义在{% %}分隔符中。
{% if name and name in ['s','s'] %}
pass
{% else %}
pass
{%endif%}
{% for item in list %}
pass
{%endfor %}
3、其他重要语句
1) 赋值语句:{% set name = [1,2,4] %}
2) with语句,类似于Python的with。
{% with foo = 1 %}
{% set bar = 2 %}
{{ foo + bar }}
{% endwith %}
3)如果想将表达式如语句一样操作,可以加上do
{% with arr = ['Sunny'] %}
{% do arr.append('Rainy') %}
{{ arr }}
{% endwith %}
三、过滤器及测试器
1、过滤器
对变量进行过滤的操作很简单,只需要在变量后加上 “|”符号即可 ,如果 {{ name | upper }}即将变量name变成大写。
多个过滤器可以共同使用,即使用多个 | 符号。
在Flask中内置的过滤器主要有tojson,即将变量变为json字符串。
{{ users |tojson|safe }}
Jinja2内置了很多的过滤器:
(1)数值过滤器
1、四舍五入 {{ 12.88 | round }};
2、绝对值 {{ -12 | abs }};
3、向下截取小数点固定位数 {{ 12.888 | round(3,'floor') }};
(2)列表过滤器
- 取列表第一个元素 {{ [1,2,5,2] | first }};
- 取列表最后一个元素 {{ [1,2,5,2] | last }};
- 返回列表长度 {{ [1,2,5,2] | length }};
- 列表求和 {{ [1,2,5,2] | sum }};
- 列表排序,默认是升序 {{ [1,2,5,2] | sort }};
- 合并为字符串,犹如Python的join {{ [1,2,5,2] | join(',') }};
- 列表中元素变为大小写,{{ ['s','df','sf'] | upper }};
(3)字典过滤器
-
按指定字段排序
users是一个字典 {% for user in users | sort(attribute='height', reverse=true) %} - {{ user.name }}, {{ user.age }} {% endfor %}
-
将字典中的某一个关键字的元素连接起来 {{ users | map(attribute='name') | join(', ') }}
(4)字符串过滤器
- 单词全大写或全小写 {{ name | lower }};
- 单词首个字母大写 {{ name |capitalize }};
- 去除字符串前后的空白 {{ " haibo " | trim }};
- 字符串反转 {{ name | reverse }};
- 格式化输出,与Python类似 {{ "%s" | format(name) }};
- 关闭HTML自动转义 {{ name | safe }};
关于更多的内置过滤器,可参考 Jinja2官网内置过滤器 。
我们也可以自定义过滤器,类似于自定义函数一样,只要使用template_filter装饰器。
@app.template_filter('sub')
def sub(l, start, end):
return l[start:end]
2、测试器
就是if控制语句加上 is,如{% if name is upper %}
内置测试器:
检查变量是否被定义,也可以用undefined检查是否未被定义
{% if name is defined %}
Name is: {{ name }}
{% endif %}
检查是否所有字符都是大写
{% if name is upper %}
{% endif %}
检查变量是否为空
{% if name is none %}
{% endif %}
检查变量是否为字符串,也可以用number检查是否为数值
{% if name is string %}
{% endif %}
检查数值是否是偶数,也可以用odd检查是否为奇数
{% if 2 is even %}
{% endif %}
检查变量是否可被迭代循环,也可以用sequence检查是否是序列
{% if [1,2,3] is iterable %}
{% endif %}
检查变量是否是字典
{% if {'name':'test'} is mapping %}
{% endif %}
微信分享/微信扫码阅读