Jinja2是Python Web编程中的主流模板语言。因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了。【Jinja2官方文档】
如何渲染模板
模板在‘templates’文件夹下(htnl页面)
从flask中导入render_template函数---渲染html模板
在视图函数中,使用render_template 函数渲染模板。注意:只需要填写模板的名字,不需要填写templates这个文件夹的路径,若在templates下面建立文件夹,则需要填写路径名称
# 1.导入依赖包
from flask import Flask, render_template
# 2.实例化app
app = Flask(__name__)
# 3.映射,默认情况下flask从templates文件夹中寻找模板文件(index.html)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<param>')
def user(name):
return render_template('index.html', param=param)
模板传参
(1)如果只有一个或者少量参数,直接在render_template
函数中添加关键字参数就可以了。
(2)如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在render_template
中, 使用两个星号,把字典转换成关键参数传递进去,这样的代码更方便管理和使用。
基本语义:
看过之前模板的例子就知道,Jinja2做构成的模板文件中,文本内容大致可以分成几个种类。比如特殊文本(不进行转义,比如HTML,XML格式的文本)、{{ }}表示的变量或者宏调用、{% %}表示逻辑控制,{# #}表示注释,其中内容不被模板引擎转义。
变量 {{..}}
列表 {% for item in List %}<li>{{item}}</li>{% endfor %}
字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %}
模板继承
{% extends 'layout.html' %}
{% block body %}
{% endblock %}
{% include 'asd.html' %}
过滤器
过滤器简单理解:、过滤器的作用就是,如果有头像就显示头像,没有头像就显示默认的头像(无头像)过滤器的作用对象是变量 {{ avatar|default('xxx') }} 模板还支持{{ 变量 | 过滤器1 | 过滤器2 | ... }}
这样的操作
以下说明中的第一个参数都是指通过管道传过去的值,实际写在管道右边的方法参数应该比下面说明中的少一个
safe: 渲染时不转义
lower: 把值转换成小写形式
upper: 把值转换成大写形式
attr(object,name) 比如account|attr("name")中account预期是一个字典(或者按照JS的说法是一个object),此时这个地方就是现实account['name']的值
capitalize(s) 把字符串的首字母大写,后面的全部小写
default(value,default_value=u'',boolean=False)设置默认值,如果没有给出value,那么就用default_value的值(即空字符串)
filesizeformat(value,binary=False)接受一个数值然后转化成容易阅读的字节形式比如1.3MB,305Byte等,{{size|filesizeformat() }}
float(value,default=0) 接受一个值并将其转化为float类型
escape(string) 把字符串中HTML特殊字符比如<,>,&等反转义成HTML的表达方式
groupby(value,attribute) 按照指定的共有属性将(一个字典组成的列表)集合进行分组,返回一个字典组成的列表。这个列表中的每个字典都有两项,第一项的key是grouper然后value是根据groupby区分后得到的那个原字典中key的值。说了一串自己都晕了,下面给个例子。。
int(value,default) 把值转化为一个int类型
join(value,sep=u'') 接受一个序列类型的对象,然后通过sep指定的字符将所有序列元素连接在一起成为一个字符串。sep默认是空字符串
last/first/random(seq) 返回序列的最后/最前/随机一个元素
replace(string,old,new,count=None) 接受一个字符串,将其中的old部分全部转化为new,从左到右替换count次,如果不指定count是只替换第一个扫描到的
reverse(value) 接受一个可迭代对象,然后返回其反序序列的迭代器
sort(value,reverse=False,case_sensative=False,attribute=None) 对可迭代的对象进行排序,默认情况下以升序大小写不敏感的方式排序。
striptags(value) 把一段比如XML格式的文本中的标签都去掉
sum(iterable,attribute=None,start=0)对可迭代对象进行求和,如果需要对其某个特定属性的值求和的话可以设置attribute属性
title(string) 将字符串转换为标题格式显示
trim(value) 去除开头和末尾的所有空格,相当于strip()
truncate(s,length=255,killwords=False,end='...')这是个比较有有意思的方法,它把字符串转化成简略形式,比如"foo bar"|truncate(5)可以得到foo ...,如果"foo bar"|truncate(5,True)可以得到foo b...
round(value,precision=0,method='common')保留几位小数、对数字进行四舍五入,precision表示小数点后保留几位。method除了common是四舍五入规则外,floor是向下抹平,ceil是向上抹平。
宏
<!--定义宏-->
{% marco input(name,type='text',value='',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"
/>
{% endmarco %}
<!--调用宏-->
{{ input('username')}}
{{ input('password',type='password')}}
如果宏比较多,可以抽到单独的html中,再import进来
{% import '_marcos.html' as ui%}
...
{{ ui.input('username')}}
<p>自定义加法函数:{{add_num(1,4)}}</p>
<p>全局函数global:{{Global(1,4,5)}}</p>
<p>全局函数filter:{{1|Filter(1,4)}}</p>