一、Jinja2简介
Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。 它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。jinja2使用BSD授权。
例:
<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
<li><a href="{
{ user.url }}">{
{ user.username }}</a></li>
{% endfor %}
</ul>
特性:
- 沙箱中执行
- 强大的 HTML 自动转义系统保护系统免受 XSS
- 模板继承
- 及时编译最优的 python 代码
- 可选提前编译模板的时间
- 易于调试。异常的行数直接指向模板中的对应行。
- 可配置的语法
二、jinja2变量显示
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 index():
"""下面的变量均为我们要传递的参数"""
name = 'westos'
li = [1,2,3,4]
d = dict(a=1, b=3, c=6)
u = User('root', 'redhat')
return render_template('index.html', #这里为链接的页面内容
name = name, #传递参数
li = li, #传递参数
d = d, #传递参数
u = u) #传递参数
if __name__ == "__main__":
# 运行web app
app.run(host='0.0.0.0', port=9008)
index.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h3>字符串变量显示</h3>
{
{ name }}
<h3>列表</h3>
{
{ li }}
<h3>字典</h3>
{
{ d }}
<!--jinja2的for循环-->
<table border="1px" width="80%">
{% for i in d %}
{% if i in ['a', 'c'] %}
<tr style="background-color: lightgray">
<td>{
{ i }}</td>
<td>{
{ d[i]}}</td>
</tr>
{% else %}
<tr style="background-color: lightpink">
<td>{
{ i }}</td>
<td>{
{ d[i]}}</td>
</tr>
{% endif %}
{% endfor %}
</table>
<h3>对象</h3>
{
{ u }}
<table border="1px">
<tr>
<td>用户名</td>
<td>密码</td>
</tr>
<tr>
<td>{
{ u.name }}</td>
<td>{
{ u.passwd }}</td>
</tr>
</table>
</body>
</html>
三、过滤器
变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。
例如 { { name|striptags|title }} 会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。过滤器接受带圆括号的参数,如同函数调用。这个例子会 把一个列表用逗号连接起来: { { list|join(', ') }} 。
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 index():
name = "reDhat"
li = [1,2,4,5]
dic = dict(a=1,b=2,c=3)
u = user('student','redhat')
return render_template('index2.html',name=name,li = li,dic = dic, u = u)
if __name__ == "__main__":
app.run('0.0.0.0',port=9009)
index.html 页面过滤
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>字符串进行过滤</h2>
{
{ name }}
<p style="color: #81a2be">{
{ name | upper }}</p>
<p style="color: #81a2be">{
{ name | lower }}</p>
<p style="color: #81a2be">{
{ name | capitalize }}</p>
<p style="color: #81a2be">{
{ name | upper |reverse }}</p>
<h2>对数字进行过滤操作</h2>
<!--自动进行四舍五入-->
<p style="color: #969896">{
{ 1.534234234 | round }}</p>
<p style="color: #969896">{
{ 1.534234234 | round(3 , 'floor') }}</p>
<p