前言
在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言。而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一。先简单介绍一下jijia2模板的用法。
系列文章
变量
模板可以说是直接展示给客户端的,那么在模板中有视图函数传递给模板的普通变量和可以直接使用的全局变量。
普通变量
- 变量的语法结构
<p>{{ bianliang }}</p> # 模板中的变量 {% if bianliang > 3 %} # 用来执行赋值或条件或判断语句 {# said something #} # 注释
- 变量对象的属性查找
bar.per # 先查找bar对象是否有per属性,再查找是否有per对象(如字典中的键值对);
bar['per'] # 先查找是否有per对象(如字典中的键值对),再查找bar对象是否有per属性;
# 如果没有找到,则返回未定义对象,默认用空字符串替代;
- 变量的来源
# render_template
render_template函数会模板和传递的变量值进行组装
# 自定义的两个变量名context和message可以在模板中使用
render_template('sleeps/sleep.html',context=users,message=data)
# render_template_string方法也可以传递变量名
render_template_string('<p>OK</p><p>OK</p>', name='aaaa')
全局变量
即不需要显性的传递,可以直接使用的变量
- request
# 通过request可以直接获取相关的属性
{{request.args}}
-
session
-
g
-
配置对象config
-
url_for()
过滤器
过滤器的使用方式为:变量名 | 过滤器。如:{{ 'aaa' | safe | lower}}
全局常用过滤器
default:如果该变量未定义或找不到,使用默认的值;
length:获取字符串,列表,元组,字典的长度
random(seq):从序列中返回一个随机项;
replace(value,old,new,count=None):将old替换为new的字符串,count设置替换的次数;
对数字的操作
abs:返回一个数字的绝对值;
round:四舍五入取整;
round(2,'floor'):截取小数点后两位;'floor'向下截取,'ceil'向上截取,'common'四舍五入,默认的; int(value):将值转换为int类型。 float(value):将值转换为float类型。 groupby(value, attribute):分组; reverse:将迭代器反转; select,selectattr:对序列中进行过滤,返回判断为True的元素组成的列表; reject,rejectattr:对序列中进行过滤,返回判断为False的元素组成的列表;
对变量的字符串操作
safe:禁用转义;
string(value):将变量转换成字符串。
list(value):将值转换成列表
urlize:将文本的url转换成可点击的链接;urlize(5):将这个链接缩短为显示指定的长度5;
wordcount(s):计算一个长字符串中单词的个数
capitalize:把变量值的首字母转成大写,其余字母转小写;
truncate(value,length=255,killwords=False):截取length长度的字符串。 lower:把值转成小写; upper:把值转成大写; title:把值中的每个单词的首字母都转成大写;适用于一句话; trim:把值的首尾空格去掉; format:格式化输出;如: <p>{{ '%s is %d' | format('name',17) }}</p> striptags:渲染之前把值中所有的HTML标签都删掉; escape:转义字符,会将<、>等符号转义成HTML中的符号。 wordwrap(s, width=79, break_long_words=True, wrapstring=None):将字符串分成指定长度一份,如{{ 'http://www.baidu.com' | wordwrap(9)}}
对列表的操作
first:取列表的第一个元素,如:{{ [1,2,3,4,5,6] | first }}
last:取最后一个元素
sum:列表求和,如果不能计算会报错;
sort:列表排序,默认按升序排列;
batch:对列表分组,形成二维列表,如:{{ [1,2,3,4,5] | batch(2,'ff') }},2个元素一组,不足的使用'ff‘替代; join:拼接列表中的元素;如:{{ [1,2,3,4,5] | join('&&') }}; upper,lower:将列表中所有的字符串改变大小写; slice:切片,返回二维列表,slice(2)设置步长
对字典的操作
dictsort(value, case_sensitive=False, by='key'):按键的首字母顺序排序,并生成列表;
如:{{ {'name':'xx','age':'23'} | dictsort }},结果:[('name',"xx"),('age','23')] sort:排序; {{ {'name':'xx','age':'23'} | sort(attribute='age', reverse=true) }} # 按指定的字段,降序排列,默认升序; attr:获取对象的属性;如:{{ {'name':'xx','age':'23'} | attr('age') }} map(value,attribute):提取值中的某一项组成一个列表;如:{{context| map(attribute='age')}},age组成一个字典;
调试
pprint(value, verbose=False):输出一个变量;
不常用的过滤器
filesizeformat(value, binary=False):将值格式化成文件的大小,如4.1 MB, 102 Bytes等;如果binary=True则为二进制;
自定义过滤器
注意:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
方法一:
过滤器其实是一个函数,可以自定义一个函数,然后通过flask的add_template_filter将我们的函数加入到过滤器表单中;
import app
def funcx(ls): return ls+3 app.add_template_filter(funcx,'add_3') # 第一个参数为函数的名字,第二个参数为过滤器的名字;
方法二:
使用template_filter函数和装饰器的方式实现;
import app
@app.template_filter('add_3')
def funcx(ls): return ls+3
全局函数
全局函数是任意函数,可以在任一场景使用,没有输入和输出值的限制。其变量相当于python中的全局变量;
使用方式:
{% set sep = joiner("|") %} # 定义一个全局变量
常用函数
range([start], stop[, step]):和python中的range的用法完全一样;
dict():传入键值对,可以生成字典;
joiner():可以初始化为一个分隔符,然后第一次调用时返回空字符串,以后再调用则返回分隔符。对分隔循环中的内容很有帮助
cycler():这是一个类,周期计允许你在若干个值中循环,传入多个值,在多个值中循环;
# cycler有三个函数
reset():重置周期计到第一个项。
next():返回当前项并跳转到下一个。 current:返回当前项。 lipsum(n=5, html=True, min=20, max=100):在模板中生成 lorem ipsum 乱数假文。默认会生成 5 段 HTML ,每段在 20 到 100 词之间。用来测试;
自定义全局函数
- 使用add_template_global函数;
# 注册全局函数
app.add_template_global(funcx,'add_3')
# 使用装饰器
@app.template_global('add_3')
def funcx(ls): return ls+3
参考:
-
http://docs.jinkan.org/docs/jinja2/templates.html#builtin-filters
-
http://jinja.pocoo.org/docs/2.10/templates/