Flask开发(五)Jinja2模板 流程控制语句

内容纲要

本篇导读:

  • 流程控制之if语句
  • 流程控制之for语句

if语句

在Jinja2模板引擎中也可以使用if和for来控制模板的渲染方向,模板引擎中。if和for语句都应该放到{% %}当中。在前端的Jinja2语法中,if可以进行判断:是否存在参数,存在的参数是否符合条件,其基本语法如下:

{% if condition %}  <!-- condition指的是条件 -->
{% else %}          <!-- 条件不满足时 -->
{% endif %}         <!-- 结束if语句 -->

在templates文件夹下创建index.html。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% if name %}
        <h1>产生的随机数有效!</h1>
    {% else %}
        <h1 style="color: red">产生的随机数无效!</h1>
    {% endif %}
</body>
</html>

修改app.py如下:

from flask import Flask,render_template
import random
app = Flask(__name__)
@app.route('/')
def hello_world():
    rand=random.randint(0,1)
    return render_template('index.html',name=rand)
if __name__ == '__main__':
    app.run(debug=True)

在app.py中的hello_world函数中,使用random产生一个0到1的随机数传入模板,在模板中判断如果这个数是1,则显示“产生的随机数数有效”,否则显示“产生的随机数无效”,运行本程序,多刷新几次,可以看到如下结果:

有效
无效

再看以下示例:

将index.html中的代码修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% if name == 1 %}
        <h1 style="color: red">恭喜,抽得一等奖!!!</h1>
    {% elif name == 2 %}
        <h1 style="color: blue">恭喜,抽得二等奖!!!</h1>
    {% else %}
        <h1 style="color: green">恭喜,抽得三等奖!!!</h1>
    {% endif %}
</body>
</html>

将app.py修改成以下代码:

from flask import Flask,render_template
import random
app = Flask(__name__)
@app.route('/')
def hello_world():
    rand=random.randint(1,3)
    return render_template('index.html',name=rand)
if __name__ == '__main__':
    app.run(debug=True)

运行程序,访问http://127.0.0.1:5000/ ,刷新几次页面,会看到不同语句页面。

在模板中,尽量少使用多层嵌套的if...else...语句,往往会因为缩进出现这样或者那样的问题。尽量使用if...elif...else的结构。

for语句

模板中的for循环语句的定义如下:

{% for 目标 in对象 %}
    <p>目标</p>
{% endfor %}

Jinja2中for循环内置常量:

  • loop.index 当前迭代的索引(从1开始)
  • loop.index0 当前迭代的索引(从0开始)
  • loop.first 是否是第一次迭代,返回True或False
  • loop.last 是否是最后一次迭代,返回True或False
  • loop.length 返回序列的长度

下面用视图函数定义一个字典goods,在模板中使用for循环渲染输出。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        th,td{
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <table>
        <thead>
            <th>商品名称</th>
            <th>商品价格</th>
        </thead>
        <tbody>
            <meta charset="UTF-8">
            {% for good in goods %}
                <tr>
                    <td>{{ good.name }}</td>
                    <td>{{ good.price }}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

上面代码实现了一个静态页面,代码中定义了一个表格,表格分为5行两列进行显示,其中,第一行用来显示表格“商品名称”及“商品价格”等内容。

app.py中的内容如下:

from flask import Flask,render_template
import random
app = Flask(__name__)
@app.route('/')#定义路由
def hello_world():#定义视图函数
       goods = [{'name': '怪味少女开衫外套春秋韩版学生bf原宿宽松运动风2018新款秋装上衣',  'price': 138.00},
                {'name': 'A7seven 复古百搭牛仔外套女秋季2018新款宽松显瘦休闲夹克衫上衣',  'price': 100.00},
                {'name': '黑色时尚西装外套女春秋中长款2018新款韩版休闲薄款chic西服上衣', 'price': 100.00},
                {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣', 'price': 129.00}
               ]#定义列表goods
       return render_template('shop.html', **locals())#渲染模板,并向模板传递参数
if __name__ == '__main__':
    app.run(debug=True)

在hello_world视图函数中定义了一个字典goods,其属性有name和price,用for循环将其遍历出来,运行程序,访问http://127.0.0.1:5000,结果如下:

运行结果

经过本篇的学习可以看出,通过{% 逻辑表达式 %}可以实现代码的嵌套,其语法与Python语法基本一致,但是必须包含在{% %}内部。

阅读剩余
THE END