您当前的位置: 首页 >  flask

IT之一小佬

暂无认证

  • 3浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Flask框架中的jinja2模板详解

IT之一小佬 发布时间:2022-08-13 23:24:53 ,浏览量:3

在Flask中,配套的模板是Jinja2,这个模板非常的强大,并且执行效率高。

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()

运行结果:

        当访问/的时候,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中。

如果程序中将要把参数传递给模板文件中时,参数传递方式如下代码所示:

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', **content)


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

index.html




    
    首页


欢迎来到首页!
name:{{ name }} sex:{{ sex }} age:{{ age }}

运行结果:

        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




    
    首页


欢迎来到首页!
names:{{ names.name }} names:{{ names['name'] }} sex:{{ sex }} age:{{ age }} {# personal info #}
    {% for name in name_list %}
  • {{ name }}
  • {% endfor %}

运行结果:

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

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。
关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.1256s