1、引入JinJa2模版html
首先咱们来对比两段代码,它们实现一样的功能, 都是现实用户信息列表:app
1 # 第一段 2 @app.route("/users") 3 def get_users():
# 前面省略逻辑处理过程,获得users列表 4 users = [{"name": "Jack", "age": 25, "city": "NewYork"}, 5 {"name": "Rose", "age": 26, "city": "Beijing"}, 6 {"name": "LiLi", "age": 23, "city": "ShangHai"}] 7 html = """ 8 <table border="1"> 9 <tr> 10 <th>姓名</th> 11 <th>年龄</th> 12 <th>城市</th> 13 </tr>""" 14 for user in users: 15 h = """<tr> 16 <td>%s</td> 17 <td>%s</td> 18 <td>%s</td> 19 </tr>"""%(user['name'], user['age'], user['city']) 20 html += h 21 html += "</table>" 22 return html 23 24 # 第二段 25 @app.route("/users") 26 def get_users_with_tempalte():
# 逻辑处理 27 users = [{"name": "Jack", "age": 25, "city": "NewYork"}, 28 {"name": "Rose", "age": 26, "city": "Beijing"}, 29 {"name": "LiLi", "age": 23, "city": "ShangHai"}] 30 return render_template("users.html", users=users)
1 <table border="1"> 2 <tr> 3 <th>姓名</th> 4 <th>年龄</th> 5 <th>城市</th> 6 </tr> 7 8 {% for user in users %} 9 <tr> 10 <td>{{ user.name }}</td> 11 <td>{{ user.age }}</td> 12 <td>{{ user.city }}</td> 13 </tr> 14 {%endfor%} 15 16 </table>
第一段代码中,将业务逻辑处理与视图展示的html都放在视图函数里,当业务处理逻辑或展示页面较复杂时,整个试图函数将会很是丑陋,难以理解且不易维护。ide
第二段代码中, 咱们将业务逻辑处理与页面展示分开,将展示逻辑转移到模版中,使得代码目的清晰,井井有条,并且在模版中咱们能够更好的进行页面渲染,这就是Jinja2模版引擎的魅力。函数
render_template()函数用于渲染模版,第一个参数表示模版文件名, 咱们须要在当前项目路径下建立一个templates文件夹,用来放置html模版文件。随后的参数都是键值对,表示模版中的变量对应的实际值。spa
2、Jinja2模版中的控制结构code
一、if-else语句htm
{% if name %} <h1>Hello, {{ name }}!</h1> {% else %} <h1>Hello, Stranger!</h1> {% endif %}
二、for循环(见(一)中示例)blog
三、宏定义继承
Jinja2中的宏,相似Python中的函数,可供须要时调用,例如对于对于上文展示用户列表的例子,咱们能够这样定义:ci
1 {% macro render_user(user) %} 2 <td>{{ user.name }}</td> 3 <td>{{ user.age }}</td> 4 <td>{{ user.city }}</td> 5 {% endmacro %} 6 7 <table border="1"> 8 <tr> 9 <th>姓名</th> 10 <th>年龄</th> 11 <th>城市</th> 12 </tr> 13 14 {% for user in users %} 15 <tr> 16 {{ render_user(user) }} 17 </tr> 18 {%endfor%} 19 20 </table>
其中:macro表示定义宏, render_user至关于函数名, user即为参数。如果某些宏重复使用率较高, 咱们能够将它们保存在一个单独的html文件中,而后经过
{% import 'macros.html as macros %}引入,相似于Python的模块调用过程。
四、模版引用
和宏的引用相似, 咱们可将多处重复使用的模版代码保存在单独的文件中,而后在须要的地方引用便可{% include 'common.html' %}
五、模版继承
模版继承相似于Python的继承,咱们能够建立一个base.html模版,该模版包含基本的html块结构,经过继承该模版,可省去在每一个模版中都书写类似内容的过程,而只突出当前模版的主要功能。
<!--base.html--> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Jinja2 Template</title> </head> <body> {% block body %} {% endblock %} </body> </html> <!-- users.html --> {% extends 'base.html' %} {% block body %} {% macro render_user(user) %} <td>{{ user.name }}</td> <td>{{ user.age }}</td> <td>{{ user.city }}</td> {% endmacro %} <table border="1"> <tr> <th>姓名</th> <th>年龄</th> <th>城市</th> </tr> {% for user in users %} <tr> {{ render_user(user) }} </tr> {%endfor%} </table> {% endblock %}
extends关键字表示继承关系, {% block body %}...{% endblock %}实现了body部份内容的个性化展示。