实际开发过程中,为提升开发效率而使前后端分离。后端负责业务逻辑及数据访问(业务逻辑),前端负责表现及交互逻辑(表现逻辑)。为分离前后端业务而将表现逻辑交给了模板引擎,模板引擎通过渲染使用真实值替换网页模板中的变量,生成一个标准的HTML文档。
Falsk框架通常使用Jinja2模板引擎实现复杂的页面渲染
示例:
模拟首页页面:
导入render_template()方法渲染模板:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/' )
def list_user(username):
return render_template('user.html')
if __name__ == '__main__':
app.run()
Flask通过Jinja2模板引擎渲染模板时,可将程序中的参数传递给指定的模板进行渲染。
render_template()函数第一个参数指定模板文件名称,第二个参数用于向模板中传递参数变量(可为空)
示例1:
模拟用户界面user.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户中心</title>
<h1>用户中心</h1>
<p>欢迎你,{{ name }}</p>
</head>
<body>
</body>
</html>
app.py:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/user/' )
def index(username):
return render_template('user.html',name=username)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
传参效果:
示例2:以键值对方式或**locals()方法传参
模拟首页:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<h1>首页</h1>
</head>
<body>
书名:{{ book }}<br>
作者:{{ author }}
</body>
</html>
app.py:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
book = '乔布斯传'
author = '沃尔特'
return render_template('index.html', **locals())
@app.route('/user/' )
def list_user(username):
return render_template('user.html',name=username)
if __name__ == '__main__':
app.run()
其中return render_template(‘user.html’,**locals())等价于 return
render_template(‘user.html’,book=book,author=author),后面这种方式即为键值对传递参数。
注意:在模板引擎中 if/for 必须放到{% %}中
基本语法:
if:
{% if condition %}
{% elif %}
{% else %}
{% endif %}
for:
{% for obj in objs %}
循环体语句
{% endfor %}
示例1:if语句
模拟首页:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<h1>首页</h1>
</head>
<body>
{% if num==1 %}
<h3>one</h3>
{% elif num==2 %}
<h3>two</h3>
{% else %}
<h3>three</h3>
{% endif %}
{#{{ num }}#}
</body>
</html>
app.py:
from flask import Flask
from flask import render_template
import random
app = Flask(__name__)
@app.route('/')
def index():
ran=random.randint(1,3)
return render_template('index.html',num=ran)
if __name__ == '__main__':
app.run()
if演示效果:
多次刷新则num值发生变化
示例2:for语句
模拟首页:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>List</title>
</head>
<body>
<table>
<thead>
<th>姓名</th>
<th>班级</th>
</thead>
<tbody>
{% for list in lists %}
<tr>
<td>{{ list.name }}</td>
<td>{{ list.class }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
app.py:
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def index():
lists=[{'name':'zhangsan','class':'one'},{'name':'lisr','class':'eight'},{'name':'wangwu','class':'three'}]
return render_template('list.html',**locals())
if __name__ == '__main__':
app.run()