Flask中的jinja2模板介绍与使用

1、模板的介绍

思考 : 网站如何向客户端返回一个漂亮的页面呢?

提示 ::

  • 漂亮的页面需要 html 、 css 、 js .
  • 可以把这一堆字段串全都写到视图中, 作为 HttpResponse() 的参数,响应给客户端

问题:

  • 视图部分代码臃肿, 耦合度高
  • 这样定义的字符串是不会出任何效果和错误的
  • 效果无法及时查看.有错也不容易及时发现

解决问题:

使用模板 Template

MVT 设计模式中的 T , Template

  • M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
  • V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
  • T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

业务请求流程图展示:

2、模板的使用

模板使用考虑的问题?响应模板,模板目录,设置模板目录。

在 Flask中,配套的模板是 Jinja2,Jinja2的作者也是Flask的作者。

这个模板非常的强大,并且执行效率高。

2.1 使用步骤

1、创建模板

  • 在 应用 同级目录下创建模板文件夹 templates . 文件夹名称固定写法.
  • 在 templates 文件夹下, 创建 应用 同名文件夹. 例, Book
  • 在 应用 同名文件夹下创建 网页模板 文件. 例 : index.html

2、设置模板查找路径

3、模板处理数据

2.2 使用流程图介绍

2.3 使用render_template渲染模板

Flask渲染Jinja2模板,通过render_template方法来渲染一个模板。

 示例代码:  

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/index')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

运行结果:

注意上面代码写法存在问题,url不能写成/index/

示例代码:

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

运行结果:

2.4 模板文件地址修改   

        当访问/的时候,index()函数会在当前目录下的templates文件夹下寻找index.html模板文件。如果想更改模板文件地址,应该在创建app的时候,给Flask传递一个关键字参数template_folder,指定具体的路径,如下面代码所示:

from flask import Flask, render_template

app = Flask(__name__, template_folder='C:\data\templates')


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

上面代码中将会把模板文件的路径修改为了C盘中的data/template中。建议使用相对路径!

2.5 模板文件传参

在使用 render_template 渲染模版的时候,可以传递关键字参数(命名参数)。

示例代码:

main.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    content = {
        "name": 'dgw',
        "age": 25,
        "sex": '男'
    }
    # return render_template('index.html', name=content['name'], age=content['age'], sex=content['sex'])
    return render_template('index.html', **content)


if __name__ == '__main__':
    app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
欢迎来到首页!
<div>
    name:{{ name }} <br>
    sex:{{ sex }} <br>
    age:{{ age }} <br>
</div>
</body>
</html>

运行结果:

        render_template需要传递的是一个关键字参数,当参数过多时可以使用字典进行包装,并且加两个*号,来转换成关键字参数。

关于Jinja2中更多参数的传递方式,如下示例代码所示:

main.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    content = {
        "names": {"name": 'dgw'},
        "age": 25,
        "sex": '男'
    }
    name_list = ['张三', '李四', '王五']
    return render_template('index.html', **content, name_list=name_list)


if __name__ == '__main__':
    app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
欢迎来到首页!
<div>
    names:{{ names.name }} <br>
    names:{{ names['name'] }} <br>
    sex:{{ sex }} <br>
    age:{{ age }} <br>

    {# personal info #}
</div>
<div>
    <ul>
        {% for name in name_list %}
            <li>{{ name }}</li>
        {% endfor %}
    </ul>
</div>
</body>
</html>

运行结果:

小技巧:

        如果你的参数项过多,那么可以将所有的参数放到一个字典中,然后在传这个字典参数的时候,使用两个星号,将字典打散成关键字参数(也叫命名参数)。

模板文件中获取参数的方式:

        获取方式是: {{childrens.name}} 或者 {{childrens['name']}}

2.6 模板文件符号使用

  •  {{ ... }}:用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的key。关于点.号访问和[]中括号访问,没有任何区别,都可以访问属性和字典的值。
  • {% ... %}:用来装载一个控制语句,以上装载的是for循环,只要涉及到控制语句的,就用{% ... %}。
  • {# ... #}:用来装载一个注释,模板渲染的时候会忽视这中间的值。

2.7 Jinja2模板属性访问规则

关于模板中这种使用:foo.bar,那么在Jinja2中是这样进行访问的:

  1. 先去查找foo的bar这个属性,也即通过getattr(foo,'bar')。
  2. 如果没有,就去通过foo.__getitem__('bar')的方式进行查找。
  3. 如果以上两种方式都没有找到,返回一个undefined。

关于模板中这种使用:foo['bar'],那么在Jinja2中是这样进行访问:

  1. 通过foo.__getitem__('bar')的方式进行查找。
  2. 如果没有,就通过getattr(foo,'bar')的方式进行查找。
  3. 如果以上没有找到,则返回一个undefined。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值