Flask框架中的jinja2模板详解
  TEZNKK3IfmPf 2023年11月13日 16 0

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

运行结果:

Flask框架中的jinja2模板详解

Flask框架中的jinja2模板详解

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

<!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>

运行结果:

Flask框架中的jinja2模板详解

        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>

运行结果:

Flask框架中的jinja2模板详解

  •  { { ... }}:用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的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。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   33   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
  TEZNKK3IfmPf   2024年05月31日   34   0   0 excelpython
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
TEZNKK3IfmPf