---模板引擎概述及使用---
概述:
模板实质上是一个静态的包含HTML语法的全部或片段的文本文件,也可以包含变量表示的动态部分,使用真实值替换网页模板的变量,生成对应的数据的HTML片段。这一过程称为渲染。Flask提供了Jinja 2 模板引擎来渲染模板。
1.实例:
1.先创建一个HTML文档
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是首页</title>
<h1>杨柳依依</h1>>
</head>
<body>
</body>
</html>
2.创建一个xxx.py文件
from flask import Flask,render_template #导入render_template
app=Flask(__name__) #初始化
@app.route('/') #定义路由
def index(): #定义视图函数
return render_template('index.html') #用render_template渲染模板
if __name__ == '__main__':
app.run(debug=True) #调试模式
重点:
1.Flask通过render_template()函数来实现渲染模板,要使用Jinja2 模板引擎,需要先导入render_template,在视图函的return()函数中,render_template函数的首个参数声名使用哪一个模板文件。注意:函数中,首个参数声名使用哪个静态文件,还可以有多个参数。
2.程序会默认在当前文件夹下的template目录下寻找模板文件,所以文件夹名称不能更改。但是,如果要改需也可以。如下:
from flask import Flask,render_template #导入render_template
app=Flask(__name__,template_folder="F:\\templates") #template_folder关键字后面跟自定义文件路径
使用template_folder关键字然后后面跟自定义的文件路径名称。
2.向模板中传递参数
Flask 提供JinJa 2模板引擎来渲染模板的同时,还可以将程序中的的参数或者变量值传递给指定的模板进行渲染。
示例:
1.创建一个user.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这里是地球</title>
<h1>你好欢迎你来到地球</h1>
</head>
<body>
</body>
</html>
2.在创建一个index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是首页</title>
<h1>欢迎来到地球: {{ name }} </h1> #传递参数
</head>
<body>
</body>
</html>
3.创建一个xxx.py文件
from flask import Flask,render_template #导入render_template
app=Flask(__name__) #后面跟自定义文件路径
@app.route('/') #定义路由
def index(): #定义视图函数
return render_template('user.html') #用render_template渲染模板
@app.route('/user/<username>') #定义路由
def user(username): #定义视图函数
return render_template('index.html',name=username) #渲染并向模板中传递参数
if __name__ == '__main__':
app.run(debug=True) #调试模式
render_template函数第一个参数指定模板文件的名称,第二个参数为可选项,可以为空。第二个参数不为空的话一般用与向模块中传递变量。传递变量一般以键值对方式进行。
模板中接收变量值,需要把变量放在{{}}中,模板中如果要写注释,格式为{#xxxx#}。
如果视图函数中有多个变量值都需要传递给模板,可以使用**locals()方法
@app.route('/')
def index():
title='窗前明月光'
author='李白想婆娘'
return render_template('index.html',**locals()) #使用**locals()方法进行传递多个
注意:传递参数的时候视图函数下的变量名要和html文档中的参数传递名要相同。
2.模板中if控制语句
在模板引擎中,if 放在{% %}
语法:
{% if name%}
{% elif %}
{% else %}
{%endif%}
示列:
1.创建index.html文件
<meta charset="UTF-8">
<title>这是首页</title>
</head>
<body>
{% if name%}
<h3>产生的随机数有效</h3>
{% else %}
<h4>产生的随机数无效!</h4>
{%endif%}
</body>
</html>
2.创建xxx.py文件
from flask import Flask,render_template
import random
app=Flask(__name__)
@app.route('/') #定义路由
def index(): #定义视图函数
randoms=random.randint(0,1) #0-1范围内的整形数
return render_template('index.html',name=randoms) # 传递参数
注意:在模板中尽量少用多层镶嵌的if...else...语句,往往会因为缩进出现很多的问题,尽量多使用if ...elif...else...的结构,这一系列条件判断会从上到下以此判断,如果判断为真,则执行对应的代码块,后面的条件就会直接忽略。不在执行。
3.模块中的for 循环
在模块中使用for 也是和if一样是放在{% %}中
语法:
{% for 目标 in 对象 %}
<p>目标</p>
{% endfor %}
Jinja 2 在for 循环中的内置常量
- loop.index:当前迭代的索引(从1开始)
- loop.index():当前迭代的索引从(从0开始)
- loop.first:是否是第一次迭代,返回真或者假
- loop.last:是否是最后一次迭代,返回真或假
- loop.length:返回序列的长度
注意:不可以使用continue 和break来控制循环的执行。
示列:
1.创建一个user.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这里是地球</title>
<h1>你好欢迎你来到地球</h1>
</head>
<body>
<table>
<tr>
<th>商品名称</th>
<th>商品价格</th>
</tr>
{% for good in good %}
<tr>
<td>{{good.trousers}}</td>
<td>{{good.price}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
2.创建一个xxx.py文件
from flask import Flask,render_template
import random
app=Flask(__name__)
@app.route('/')
def index():
good=[
{'trousers':'开裆裤','price':100},{'trousers':'连体裤','price':200},
{'trousers':'短裤','price':500}
]
return render_template('user.html',**locals())
if __name__ == '__main__':
app.run(debug=True)
注意:通过{%表达式%}可以是实现代码的镶嵌,语法和基本一致,但是都要包含在{% %}中。
Flask过滤器
说明:过滤器本质上是一个转换函数,有时候不仅需要输出变量的值,还要把某个变量的值修改后显示出来,而在模板中不能直接调用python中的某些方法。所以可以使用过滤器。
1.与字符串相关的过滤器
<p>{{ name|default('None',ture) }}</p>
其中,name为变量名,如果name为空,则用None值去替代。
<p>{{ 'hell'|capitalize }}</p>
将字符串hell转换为首字母大写的目的。
<p>{{ 'HELLO'|lowere }}</p>
将字符串HELLO全部转换为小写
<p>{{ 'hello'|replace('h','x') }}</p>
2.与列表相关的过滤器
<p>{{ [1,2,3,4]|first }}</p>
获得列表中的首个元素
<p>{{ [0,1,2,3]|last }}</p>
获得列表元素中的最后一个
<p>{{ [1,2,3,4]|count}}</p>
获得列表元素中的个数
<p>{{ [1,2,3,4] |sort}}</p>
对列表中的元素进行排序
<p>{{ [2,3,4,5]|join('') }}</p>
对列表中的元素合并为字符串
3.与数值相关的过滤器
<p>{{ 111.22222|round }}</p>
四舍五入取整数
<p>{{ 18.8888|round(2,floor) }}</p>
保留小数点后面两位
<p>{{ -2|abs }}</p>
返回绝对值
自定义过滤器
app.add_template_filter()#第一个参数为函数名,第二个参数为过滤器名。