目录
渲染方法
Flask 中的渲染方法有两种 : render_template()
和 render_template_string()
-
render_template() 函数
渲染一个指定的文件 , 这个指定的文件其实就是模板
模板中代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我的模板html内容 <br/>{{ my_str }} <br/>{{ my_int }} <br/>{{ my_array }} <br/>{{ my_dict }} </body> </html>
创建视图函数,将该模板内容进行渲染返回
@app.route('/') def index(): return render_template('temp_demo1.html')
访问:http://127.0.0.1:5000/ 运行测试
一、代码中传入字符串,列表,字典到模板中
@app.route('/')
def index():
# 往模板中传入的数据
my_str = 'Hello'
my_int = 10
my_array = [3, 4, 2, 1, 7, 9]
my_dict = {
'name': 'xiaoming',
'age': 18
}
return render_template('temp_demo1.html',
my_str=my_str,
my_int=my_int,
my_array=my_array,
my_dict=my_dict
)
最终运行的效果为:
我的模板html内容
Hello
10
[3, 4, 2, 1, 7, 9]
{'name': 'xiaoming', 'age': 18}
二、代码中进行相关取值、运算
<br/> my_int + 10 的和为:{{ my_int + 10 }}
<br/> my_int + my_array第0个值的和为:{{ my_int + my_array[0] }}
<br/> my_array 第0个值为:{{ my_array[0] }}
<br/> my_array 第1个值为:{{ my_array.1 }} # 传入的是个list,在模板语言中可以直接通过下标方式来取,下标可以不用加中括号[],如:lis.1
<br/> my_dict 中 name 的值为:{{ my_dict['name'] }}
<br/> my_dict 中 age 的值为:{{ my_dict.age }} # 传入的是字典可以直接通过dict.key方式来取,可以可以不写中括号[]
渲染后运行结果为:
my_int + 10 的和为:20
my_int + my_array第0个值的和为:13
my_array 第0个值为:3
my_array 第1个值为:4
my_dict 中 name 的值为:xiaoming
my_dict 中 age 的值为:18
可以看出:{{ 变量 }} 会被模板所代替为相应的变量值以及进行计算。
jinja的语言:
控制结构 {% %} 变量取值 {{ }} 注释 {# #}
jinja语言不会参考我的另一篇博客:Jinja2模板语言最基础入门_菜菜zhao的博客-CSDN博客
-
render_template_string()函数
该函数用来渲染一个字符串,SSTI与render_template_string()函数密不可分。
render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把 {undefined{**}} 包裹的内容当做变量解析替换。
示例:
# encoding=utf-8
from flask import Flask, render_template_string
app = Flask(__name__)
user = {"username": "xiaoxiao",
"bio": "A girl who loves movies."}
movies = [
{'name' : 'My Neighbor Totoro','year':'1988'},
{'name': 'Three Colours trilogy', 'year': '1993'},
{'name': 'Forrest Gump', 'year': '1994'},
{'name': 'Perfect Blue', 'year': '1997'},
{'name': 'The Matrix', 'year': '1999'},
{'name': 'Memento', 'year': '2000'},
{'name': 'The Bucket list', 'year': '2007'},
{'name': 'Black Swan', 'year': '2010'},
{'name': 'Gone Girl', 'year': '2014'},
{'name': 'CoCo', 'year': '2017'}
]
@app.route('/hi')
def hi():
return "hello flask!"
@app.route("/watchlist")
def watchlist():
return render_template_string(
"""{% for movie in movies %}
<li>{{ movie.name }} - {{ movie.year }}</li>
{% endfor %}
""", movies=movies)
if __name__ == "__main__":
app.run(debug=True)
浏览器访问:http://127.0.0.1:5000/watchlist
由以上的例子我们可以得出:
传入jinja2中的变量值可以是字符串、字典、列表,元组,也可以是函数和类实例。
再次体会了
render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把 {undefined{**}} 包裹的内容当做变量解析替换。
至于这个flask模板注入的漏洞,我会写在下一篇博客里。
See you next blog!