Flask开发(四)Jinja2模板引擎

内容纲要

本篇导读:

  • 模板引擎概述
  • Jinja2简单使用
  • 向模板中传递参数

模板引擎概述

随着不同终端的兴起,开发人员在越来越多的思考:如何写一份代码(业务逻辑代码),这份业务逻辑代码能够在响应式或非响应式设备上都能够使用。为了提高开发效率,开发人员开始高度重视前后端的分离,后端负责业务逻辑/数据访问,前端负责表现、交互逻辑,同一份业务逻辑代码可应用于多个不同终端的视图渲染。后端是实际上实现的功能一般叫做业务逻辑,前端完成的功能一般叫做表现逻辑。如果把业务逻辑和表现逻辑放在一起,势必造成系统耦合度高、代码维护困难的现象,因此分离业务逻辑和表现逻辑,把表现逻辑交给视图引擎,即网页模板,很有必要。

模板实质上是一个静态的包含HTML语法的全部或片段的文本文件,也可能包含由变量表示的动态部分。使用真实值替换网页模板中的变量,生成对应数据的HTML片段,这一过程称为渲染。Flask提供了Jinja2模板引擎来渲染模板,下面逐步介绍其模板渲染机制。

Jinja2模板引擎介绍

在Flask中通常使用Jinja2模板引擎来实现复杂的页面渲染。jinja2被认为是灵活、快速和安全的模板引擎技术,被广泛使用。Jinja2的设计思想来源于Django模板引擎,它功能强大、速度快,并且提供了可选的沙箱模板执行环境安全保证机制,具有沙箱中执行,强大的HTML转义系统、模板继承等优点。

Jinja2模板引擎简单使用

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
</head>
<body>
    <h1>这是首页中的文字!</h1>
</body>
</html>

 

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是用户中心</title>
</head>
<body>
    <h1>这里是用户中心!!</h1>
</body>
</html>
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
    return render_template('index.html')
@app.route('/user/&lt;username&gt;')
def user_center(username):
    return render_template('user.html')
if __name__ == '__main__':
    app.run(debug=True)

Flask通过使用render_template()函数来实现模板的渲染。需要从flask中导入render_template函数。在render_template函数中首个参数声明了使用哪一个模板文件。运行上面代码,其结果如下:

访问首页
访问用户中心

向模板中传递参数

Flask提供Jinja2模板引擎来渲染模板的同时,还可以将程序之中的参数或变量值传递给指定的模板进行渲染。

index.html中的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
</head>
<body>
    <h1>这是首页中的文字!</h1>
</body>
</html>

将user.html修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是用户中心</title>
</head>
<body>
    <h1>欢迎您:{{ name }}</h1>
</body>
</html>

app.py文件代码如下:

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
    return render_template('index.html')
@app.route('/user/&lt;username&gt;')
def user_center(username):
    return render_template('user.html',name = username)
if __name__ == '__main__':
    app.run(debug=True)

运行程序,访问http://127.0.0.1:5000/user/zhangsan

访问用户中心

上面例子中,render_template的第一个参数填写模板名称,第二个参数使用键值对的方式向模板中传入变量。

将视图函数hello_world()修改如下:

@app.route('/')
def hello_world():
    title='我在学习'
    author='雪落长安'
    return render_template('index.html',var1=title,var2=author)

将index.html文件修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
</head>
<body>
    {#    <h1>这是首页中的文字!</h1>#}
    {#模板中使用注释#}
    标题:{{ var1 }}<br>
    作者:{{ var2 }}
</body>
</html>

运行程序,访问http://127.0.0.1:5000

访问首页

模板中接受变量值,需要把变量放在{{ }},比如{{var1}}。如果模板中需要写注释,格式为{{##}},比如上面{#模板中使用注释#}。如果模板中需要传入多个参数,可以使用**locals()方法,例如:

@app.route('/')
def hello_world():
    title='我在学习'
    author='雪落长安'
    return render_template('index.html',**locals())

这样就会把本地的变量全部传入模板,此时模板中的变量需要修改成如下形式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是首页</title>
</head>
<body>
    {#    <h1>这是首页中的文字!</h1>#}
    {#模板中使用注释#}
{#    标题:{{ var1 }}<br>#}
{#    作者:{{ var2 }}#}
    标题:{{ title }}<br>
    作者:{{ author }}
</body>
</html>
阅读剩余
THE END