Flask的渲染方法函数---render_template()/render_template_string()

目录

渲染方法

render_template() 函数

一、代码中传入字符串,列表,字典到模板中

二、代码中进行相关取值、运算

render_template_string()函数

示例:


渲染方法

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!

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值