Python Flask模板渲染详解:Jinja2语法、过滤器与实战
本文深入解析Flask框架中的模板渲染机制,重点介绍Jinja2模板引擎的核心语法,包括变量、语句及注释定界符的使用。详细讲解如何利用内置过滤器处理数据,并通过完整的代码示例演示如何创建模板、准备虚拟数据以及使用render_template函数实现动态页面渲染,帮助开发者掌握Flask Web开发中的关键技能。
在常规Web应用中,访问特定URL通常会返回包含各类信息的HTML页面。由于Web应用具有动态特性,页面内容需根据具体场景灵活调整,例如区分登录与未登录用户以展示不同信息,因此页面必须在用户请求时依据程序逻辑动态生成。
我们将包含变量和运算逻辑的HTML或其他格式文本定义为模板,而执行变量替换和逻辑计算的过程称为渲染,这一过程由模板渲染引擎(如Jinja2)完成。
在默认配置下,Flask会在程序实例所在模块同级目录下的templates文件夹中查找模板文件。

模板基本语法
在模板文件中,必须使用特定的定界符来标识Jinja2语句和变量。
以下是三种常用的定界符及其用途:
1、{{ … }} 用于标记变量。
2、{% … %} 用于标记控制语句,例如if语句或for循环。
3、{# … #} 用于编写注释。
模板中引用的变量必须在渲染过程中作为参数传递进去。
编写主页模板
首先在templates目录下创建movie.html文件作为主页模板。该页面需展示电影条目列表及个人相关信息,具体代码实现如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>movie list</title>
</head>
<body>
{# 使用 length 过滤器获取 movies 变量的长度 #}
<p>{{ movies|length }} Titles</p>
<ul>
{% for movie in movies %} {# 迭代 movies 变量 #}
<li>{{ movie.title }} - {{ movie.year }}</li> {# 等同于 movie['title'] #}
{% endfor %} {# 使用 endfor 标签结束 for 语句 #}
</ul>
</body>
</html>
为便于处理变量,Jinja2提供了多种过滤器(其功能与Vue.js框架中的过滤器类似),语法格式为: {{ 变量|过滤器 }}
语法左侧为变量名,右侧为过滤器名称。例如,上述模板中使用length过滤器获取movies列表的长度,其作用类似于Python内置的len()函数。
准备虚拟数据
为了模拟页面渲染效果,需先创建一些虚拟数据以填充页面内容,相关数据定义在template.py文件中。
movies = [{'title': '长津湖', 'year': '2021'},{'title': '送你一朵小红花', 'year': '2021'}]
渲染主页模板
利用render_template()函数可完成模板渲染,该函数必须接收模板文件名(相对于templates根目录的路径)作为必选参数,此处即为'movie.html'。为确保模板正确渲染,还需通过关键字参数将模板内部所需的变量传入该函数,示例如下:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def movie():
return render_template('movie.html', movies=movies)
if __name__ == "__main__":
app.run()
在传入 render_template() 函数的关键字参数中,左侧的movies代表模板中使用的变量名,右侧的movies则指向实际的数据对象。传入模板的movies为列表类型,但模板支持接收多种Python数据结构,包括字符串、元组、字典及函数等。
调用 render_template() 函数时,系统会识别并执行“movie.html”中所有的Jinja2语句,最终返回渲染后的模板内容。在返回的页面中,变量会被替换为实际值(包括定界符保留),而语句(及其定界符)在执行后会被移除(注释同样被移除)。

总结
本文到此结束,希望能为读者提供有益帮助,同时也欢迎大家关注本站以获取更多技术内容!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













