Janjia2模板引擎
python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护;
模板渲染: 在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
其他的模板引擎: Mako, Template, Jinja2
1.python自带的模块
import string
strObj = string.Template("$who is $role")
# 渲染字符串的过程;
print(strObj.substitute(who="fentiao", role="cat"))
2.Jinja2变量显示语法: {{ 变量名 }}
例如:
# for循环:
{% for i in li%}
{% endfor %}
# if语句
{% if user == 'westos'%}
{% elif user == 'hello' %}
{% else %}
{% endif%}
实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>变量:</p> {{ name }}
<p>列表:</p> {{ li }}
/*依次遍历列表的每一个元素*/
{% for i in li %}
<br/> 列表元素显示: {{ i }}
{% endfor %}
<p>字典:</p> {{ d }}
<p>字典:</p> {{ d.a }}
<p>字典:</p> {{ d['a'] }}
<p>字典:</p> {{ d.b }}
<p>字典:</p> {{ d['b']}}
<p>对象:</p> {{ u }}
<table>
<tr>
<th>用户名</th>
<th>密码</th>
</tr>
<tr>
<td>{{ u.name }}</td>
<td>{{ u.passwd }}</td>
</tr>
</table>
</body>
</html>
运行函数
from flask import Flask, render_template
app = Flask(__name__)
class User(object):
def __init__(self, name, passwd):
self.name = name
self.passwd = passwd
def __str__(self):
return "<User: %s>" %(self.name)
@app.route('/')
def index1():
name = "这是一个消息"
li = [1, 2, 4, 5]
d = dict(a=1, b=2)
u = User("villa", "passwd")
return render_template('index1.html',
name = name,
li = li,
d = d,
u = u
)
app.run(port=5003)
3.过滤器与自定义过滤器
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
/*什么是过滤器?
实质上就是一个转换函数/方法
*/
{{ timestamp }}
{{ timestamp | format_date }}
/*常见的字符串过滤器操作:*/
<ul>
<li>{{ name | upper }}</li>
<li>{{ name | lower }}</li>
<li>{{ "hello" | capitalize }}</li>
<li>{{ " hello world" | capitalize }}</li>
<li>{{ name | reverse }}</li>
</ul>
/*常见数值操作*/
<ul>
<!--四舍五入-->
<li>{{ -12.9623423435 | round }}</li>
<li>{{ -12.9623423435 | round | abs }}</li>
</ul>
/*列表常见:*/
<ul>
<li>{{ li }}</li>
<li>{{ li | first }}</li>
<li>{{ li | last }}</li>
<li>{{ li | length }}</li>
<li>{{ li | sum }}</li>
<li>{{ li | sort | reverse }}</li>
<li>{{ li | join(":") }}</li>
<li>{{ ["hello", "world"] | upper}}</li>
<li>{{ ["hello", "woHld"] | lower}}</li>
</ul>
/*列表包含字典常用操作:*/
<ul>
{% for item in liDict | sort(attribute='price', reverse=false) %}
{{ item }}
{% endfor %}
</ul>
</body>
</html>
Python运行程序
import time
from flask import Flask, render_template
app = Flask(__name__)
class User(object):
def __init__(self, name, passwd):
self.name = name
self.passwd = passwd
def __str__(self):
return "<User: %s>" % (self.name)
# 自定义一个转换时间格式的过滤器
@app.route('/')
def index2():
name = " this is a message"
li = [1, 2, 4, 5]
d = dict(a=1, b=2)
liDict = [
{
'count': 100,
'price': 30
},
{
'count': 110,
'price': 20
},
]
u = User("westos", "passwd")
timestamp = time.time()
return render_template('index2.html',
name=name,
li=li,
d=d,
u=u,
liDict=liDict,
timestamp=timestamp
)
def format_date(value, format="%Y-%m-%d %H:%M:%S"):
# 时间戳----> 元组
ttime = time.localtime(value)
# 元组 --- > 指定字符串
return time.strftime("%Y-%m-%d %H:%M:%S", ttime)
app.add_template_filter(format_date, 'format_date')
@app.route('/index3/')
def index3():
return render_template('index3.html',
timestamp=time.time())
app.run(port=5004)
4. 模板与继承
模板继承语法:
1. 继承某个模板
{% extends "模板名称" %}
2. 挖坑和填坑
挖坑:
{% block 名称 %}
默认值
{% endblock %}
填坑:
{% block 名称 %}
{% endblock %}
3. 调用/继承被替代的模板
挖坑:
{% block 名称 %}
默认值
{% endblock %}
填坑:
{% block 名称 %}
#继承挖坑时的默认值
{{ super() }}
# 后面写新加的方法.
........
{% endblock %}