## Flask模板
1、jinja2及渲染方式
Flask的配套模板时jinja2,同一个作者
使用rander_template渲染模板,所有的模板都放置于templates中,rander_template(文件名,需要渲染的内容),网页中用{{ }}可读取数据库中内容。
视图内容
from flask import Flask, render_template
#创建Flask对象
app = Flask(__name__)
#需要渲染的内容,此部分内容一般从数据库中抓取
content = {
'name':'kk',
'age':18,
'sex':1
@app.route('/')
def index():
return render_template('index.html', **content)
网页代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{name}}</h1>
<h2>{{age}}</h2>
<h3>{{sex}}</h3>
</body>
</html>
2、模板过滤器
模板过滤器可以对由后端传递过来的一些数据做一些判断。
通常用管道符号|。如{{变量|条件}}
视图内容
from flask import Flask, render_template
app = Flask(__name__)
#此参数设定后,只要模板变化,flask会自动刷新
app.config['TEMPLATES_AUTO_RELOAD'] = True
content = {
'name': 'kML',
'age': 20.5,
'books': {
'python': 30,
'java': 20,
'php': 10,
'flask': -50
},
'input_content': '<input type = "text" name ="text">'
}
@app.route('/')
def index():
return render_template('index.html', **content)
index.html模板内容
<div>
<p>
{# default 判断,若不存在username,则显示加载中 #}
{{username|default('加载中')}}
</p>
<p>
{# 计算input_content长度 #}
{{input_content|length}}
</p>
<p>
{# 关闭转义,再已确认input_content安全的情况下#}
{{input_content|safe}}
</p>
<p>
{# 系统默认转义打开,故此e/escape只有在转义关闭的时候使用 #}
{{input_content|e}}
</p>
<p>
{# replace(old,new),old表示name中存在的部分,new表示新的内容 #}
{{name|replace('k','l')}}
</p>
<p>
{# first:返回一个序列的第一个元素 #}
{{name|first}}
</p>
<p>
{# last:返回序列的最后一个元素 #}
{{name|last}}
</p>
<p>
{# join:将一个序列用d这个参数的值拼接成字符串,最后显示为k_m_l。 #}
{{name|join(d='_')}}
</p>
<p>
{# int:将值转换为int类型。 #}
{{age|int}}
</p>
<p>
{# float:将值转换为浮点数类型。 #}
{{age|float}}
</p>
<p>
{# lower:将字母转为小写。 #}
{{name|lower}}
</p>
<p>
{# upper:将字母转为大写。 #}
{{name|upper}}
</p>
<p>
{# truncate:截取length长度的字符串,length:表示显示长度,killwords:表示是否截断单词,leeway:偏差。 #}
{{input_content|truncate(length=5,killwords=False,leeway=0)}}
</p>
</div>
4、控制语句
控制语句都写在{% xxx %} 内,for 、if 语句都必须以end结尾
如:
{% for item in items %}
{% endfor %}
{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}
4.1、for循环
视图内容与2中视图内容一致
<div>
{# for循环读字典内容 #}}
<table>
<tr>
<td>序号</td>
<td>书名</td>
<td>价格</td>
</tr>
<tr>
{% for key,value in books.items() %}
{# loop.length:序列长度。loop.first/last:是否第一次/最后一次迭代,返回True或False #}
{# loop.index:从1开始迭代。loop.index0:从0开始迭代 #}
<th> {{loop.index}}</th>
<th>{{ key }}</th>
<th>{{ value|abs }}</th>
<tr>
{% endfor %}
</tr>
</table>
</div>
4.2、if判断
视图内容与2中视图内容一致
<div>
{# if判断 #}
<p>年龄多少:
{% if age > 18 %}
{{age}}
{% else %}
'不存在'
{% endif %}
</p>
</div>
4.3、宏和import导入
宏搭载于html格式的文本中,相当于定义一个功能函数,html文本可以随时导入,并重复使用它
#forms.html语法
{% macro 名称(变量1,变量2,变量3) %}
{% for item in range(0,变量1) %}
<input type="text">
{% endfor %}
{% endmacro %}
#在html的界面中导入forms.html
{% from 'forms.html' import 名称 %}
{{名称(3)}}
4.4、include和set语句
include语句将一个模板引入到另外一个模板中
{% include 'header.html' %}
set语句在模板中添加一个变量
with语句中的变量只能在with中生效。全局中的变量与with中的变量互不影响
{% with %}
{% set foo = 42 %}
{{ foo }}
{% endwith %}
#或者
{% with foo = 42 %}
{{ foo }}
{% endwith %}
4.5、模板继承
Flask中模板通过block定义,只要父模板有block接口,子模板就可以通过block来重写或者在原有基础上新增
格式
{% extends "base.html" %}
{% block 名称 %}
<h1>xxx</h1>
{% endblock %}
父模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> {% block title %}
{% endblock %} </title>
</head>
<body>
{% block header %}
<h1>base-header</h1>
{% endblock %}
{% block center %}
<p>base-content</p>
{% endblock %}
{% block footer %}
<h6>base-footer</h6>
{% endblock %}
</body>
</html>
子模板
{% extends "base.html" %}
{% block center %}
<p>这是content</p>
{% endblock %}
{% block footer%}
<h6>{{name|upper}}</h6>
<p>
{% for item in books.item %}
{% end for %}
</p>
{% endblock %}