Flask中Jinja2模板引擎的变量、逻辑与继承用法详解
本文深入解析Flask中Jinja2模板引擎的核心用法。涵盖变量{{ }}与语句{% %}的语法区别,演示如何传递字典、列表及对象至前端;详解if条件判断与for循环的实现方式;并通过block与extends标签解析模板继承机制,帮助开发者构建结构清晰、易于维护的Web页面。
Jinja2
设想这样一个应用场景:网站希望实现权限控制,只有充值成为VIP的用户才能查看特定隐藏内容。在Flask框架下,应如何实现这一功能?
此时,Jinja2模板引擎便派上了用场。
首先编写后端代码,根据传入的姓名渲染网页,并将姓名和VIP状态变量传递至HTML模板中。
需要注意的是,包含Jinja2语法的HTML文件无法直接在浏览器中打开预览,必须启动Flask应用并通过路由返回页面才能正确渲染。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/space/<name>')
def space(name):
vip = True
return render_template("space.html", name=name, vip=vip)
if __name__ == '__main__':
app.run(debug=True)
当HTML模板接收到Flask传递过来的name、vip参数后,在前端页面中应如何调用这些值?
- 利用
{{ }}语法可以装载变量。例如,在文中通过{{ name }}将HTML中的name变量值显示出来。 - 若需执行逻辑语句,则使用
{% %}语法。以if语句为例,如代码8-11行所示,条件判断必须以{% if xxx %}开头,并以{% endif %}结束。
<!doctype html>
<html lang="en">
<head>
<title>Hello from Flask</title>
</head>
<body>
<h1>Hello {{ name }}!</h1>
<!-- jinja2的if语句 -->
{% if vip %}
<h3>吆西,你触发了,隐藏内容啦!</h3>
{% endif %}
</body>
</html>
Jinja2语句扩展
总结而言:在Jinja2中,装载变量使用{{ }},装载逻辑语句使用{% %},括号内的内容均遵循Python的书写规范。
在HTML中,我们传递的变量类型不仅限于字符串,还可能包含列表、对象或字典等复杂数据结构。
针对不同类型的数据,装载方式如下所示:
# python
a = [1,2,3]
b = Cat(name="Tom")
c = {"name":"Jackson"}
# html
<h1>Hello {{ a[0] }}!</h1>
<h1>Hello {{ b.name }}!</h1>
<h1>Hello {{ c['name '] }}!</h1>
# 输出结果 Hello 1! Hello Tom! Hello Jackson!
在HTML中,除了条件判断,循环语句同样重要。Jinja2的循环语法示例如下:
{% for item in navigation %}
<li><a href="{{ item.href }}" rel="external nofollow" >{{ item.caption }}</a></li>
{% endfor %}上述代码生成了len(navigation )个li元素,每个li元素均指向item.href定义的链接地址。
如果内容对您有帮助,欢迎点赞支持。
Jinja2模板继承
Jinja2的模板继承机制与面向对象中的类继承有相似之处,主要目的是减少代码冗余。接下来展示一个Jinja2模板继承的具体示例:
我们创建一个名为base.html的基础模板文件,其代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="base.css" rel="external nofollow" />
<title>{% block title %}{% endblock %}</title>
{% block head %}{% endblock %}
</head>
<body>
<div id="body">{% block body %}{% endblock %}</div>
</body>
</html>
在上述代码中,{% block xxx %} {% endblock %}用于定义一个“卡槽”(Block),以便后续页面在该位置填充具体内容。
接下来,编写一个index.html文件来继承base.html页面,具体实现方式如下:
{% extends "base.html" %}
{% block title %}首页{% endblock %}
{% block body %}
<h1>这里是首页</h1>
<p class="detail">
首页的内容
</p>
{% endblock %}
{% extends “base.html” %} 用于声明继承base.html模板。
{% block title %}首页{% endblock %} 用于填充title卡槽的具体内容。
首页通过卡槽填充内容,body卡槽的用法与之相同。
至此,关于Flask中Jinja2引擎用法的介绍完毕。如需了解更多Flask与Jinja2相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













