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/<username>') 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/<username>') 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>