Flask入门到精通(三)

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>
users.html

第一段代码中,将业务逻辑处理与视图展示的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部份内容的个性化展示。

相关文章
相关标签/搜索