目录
1、HTML代码中不能包含Jinja2条件判断的注释(这应该算是Jinja2的一个bug)
描述
Jinja2模板中的条件控制语句(if,elif,else)可以控制前端逻辑显示。
Jinja2条件控制语法
Jinja2的条件控制与Python类似,但还是有一些不同:
{% if condition %} html code... {% elif condition %} html code... {% else %} html code... {% endif %}
其中elif和else可选,也可以出现elif任意次,这与Python用法相同。
条件表达式中可以使用not、and、or等关键字。
每个条件控制语句块结束后都要另起一行加上 {% endif %},否则服务器会报错500。
条件控制True/False场景
在Jinja2条件控制结构中,以下情况条件表达式结果为False:
- 条件表达式的值为False;
- 条件表达式的值为None;
- 条件表达式的值为空字符串;
- 条件表达式的值为数字0(整型0或浮点数0)
- 条件表达式的值为空列表;
- 条件表达式的值为空字典。
使用示例
1. 条件表达式的值是False
HTML代码 demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if element %}
<p>element value is true.</p>
{% else %}
<p>element value is false.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", element=False)
if __name__ == '__main__':
app.run()
运行结果:
2. 条件表达式的值是None
html代码同上。
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html")
if __name__ == '__main__':
app.run()
运行结果:
3. 条件表达式的值为字符串
传入两个字符串,其中一个字符串为空串””。
HTML代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if element1 %}
<p>element1 value is {
{element1 | upper}}.</p>
{% else %}
<p>element1 value is an empty string.</p>
{% endif %}
{% if element2 %}
<p>element2 value is {
{element2 | upper}}.</p>
{% else %}
<p>element2 value is an empty string.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", element1="", element2="Flask is fun.")
if __name__ == '__main__':
app.run()
运行结果:
结论:
当字符串的值为空串时,Jinja2条件控制逻辑判定为False。
4. 条件表达式的值是数值型
传入两个数值,一个为0,一个非0.
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if value1 %}
<p>value1 is <span>{
{value1}}</span>!</p>
{% else %}
<p>value1 is zero.</p>
{% endif %}
{% if value2 %}
<p>value2 is <span>{
{value2}}</span>!</p>
{% else %}
<p>value2 is zero.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", value1=23, value2=0)
if __name__ == '__main__':
app.run()
运行结果:
结论:
当传入的数值的值为0时,Jinja2条件控制逻辑判断为False。
补充:传入的数值不局限为整型。即使传入的数据为浮点型0.0,Jinja2依然判定为False。
5. 条件表达式的值是列表
传入一个非空列表:
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if list %}
<p>list value is: <span>{
{list}}</span>!</p>
{% else %}
<p>It's an empty list.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", list=[23, "OpenStack"])
if __name__ == '__main__':
app.run()
运行结果:
结论:
当传入的数据是列表时,Jinja2条件控制逻辑判定非空列表为True。
6. 条件表达式的值是元组
传入一个空元组。
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if tuple %}
<p>tuple value is: <span>{
{tuple}}</span>!</p>
{% else %}
<p>It's an empty tuple.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", tuple=tuple())
if __name__ == '__main__':
app.run()
运行结果:
结论:
当传入的数据是元组时,Jinja2条件控制逻辑判定空元组为False。
7. 条件表达式的值是集合
传入一个非空集合:
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if set %}
<p>set value is: <span>{
{set}}</span>!</p>
{% else %}
<p>It's an empty set.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", set={"nova", "cinder", "neutron"})
if __name__ == '__main__':
app.run()
运行结果:
结论:
当传入的数据是集合时,Jinja2条件控制逻辑判定非空集合为True。
8. 条件表达式的值是字典
传入一个非空字典:
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if map %}
<p>map value is: <span>{
{map}}</span>!</p>
{% else %}
<p>It's an empty map.</p>
{% endif %}
</body>
</html>
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", map={"country":"China"})
if __name__ == '__main__':
app.run()
运行结果:
结论:
当传入的数据是字典时,Jinja2条件控制逻辑判定非空字典为True。
总结
Jinja2模板条件表达式判断为False的场景:
1、值为 False
2、值为 None
3、值为空字符串 ""
4、数值为 0(浮点数或整数)
5、空列表 []
6、空元组 ()
7、空集合 set()
8、空字典 {}
注意事项
1、HTML代码中不能包含Jinja2条件判断的注释(这应该算是Jinja2的一个bug)
如果HTML代码中包含了具有Jinja2条件判断的注释,服务器访问该接口时报错500。
下面来看具体代码:
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja condition demo</title>
</head>
<body>
{% if map %}
<p>map value is: <span>{
{map}}</span>!</p>
{% else %}
<p>It's an empty map.</p>
{% endif %}
<!--{% if map %}-->
</body>
</html>
注意14行有一处注释包含了Jinja2条件控制语句。
Python脚本:
import flask
app = flask.Flask(__name__)
@ app.route("/")
def index():
return flask.render_template("demo.html", map={"country":"China"})
if __name__ == '__main__':
app.run()
运行Python脚本,访问该接口后,服务端报错500:
127.0.0.1 - - [07/Dec/2019 11:46:21] "GET / HTTP/1.1" 500 -
今天的文章Jinja2条件控制分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9863.html