• Flask框架中的jinja2模板详解


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

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

     示例代码:  

    1. from flask import Flask, render_template
    2. app = Flask(__name__)
    3. @app.route('/index')
    4. def index():
    5. return render_template('index.html')
    6. if __name__ == '__main__':
    7. app.run()

    运行结果:

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

    示例代码:

    1. from flask import Flask, render_template
    2. app = Flask(__name__)
    3. @app.route('/')
    4. def index():
    5. return render_template('index.html')
    6. if __name__ == '__main__':
    7. app.run()

    运行结果:

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

    1. from flask import Flask, render_template
    2. app = Flask(__name__, template_folder='C:\data\templates')
    3. @app.route('/')
    4. def index():
    5. return render_template('index.html')
    6. if __name__ == '__main__':
    7. app.run()

    上面代码中将会把模板文件的路径修改为了C盘中的data/template中。

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

    main.py

    1. from flask import Flask, render_template
    2. app = Flask(__name__)
    3. @app.route('/')
    4. def index():
    5. content = {
    6. "name": 'dgw',
    7. "age": 25,
    8. "sex": '男'
    9. }
    10. return render_template('index.html', **content)
    11. if __name__ == '__main__':
    12. app.run()

    index.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>首页title>
    6. head>
    7. <body>
    8. 欢迎来到首页!
    9. <div>
    10. name:{{ name }} <br>
    11. sex:{{ sex }} <br>
    12. age:{{ age }} <br>
    13. div>
    14. body>
    15. html>

    运行结果:

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

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

    main.py

    1. from flask import Flask, render_template
    2. app = Flask(__name__)
    3. @app.route('/')
    4. def index():
    5. content = {
    6. "names": {"name": 'dgw'},
    7. "age": 25,
    8. "sex": '男'
    9. }
    10. name_list = ['张三', '李四', '王五']
    11. return render_template('index.html', **content, name_list=name_list)
    12. if __name__ == '__main__':
    13. app.run()

    index.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>首页title>
    6. head>
    7. <body>
    8. 欢迎来到首页!
    9. <div>
    10. names:{{ names.name }} <br>
    11. names:{{ names['name'] }} <br>
    12. sex:{{ sex }} <br>
    13. age:{{ age }} <br>
    14. {# personal info #}
    15. div>
    16. <div>
    17. <ul>
    18. {% for name in name_list %}
    19. <li>{{ name }}li>
    20. {% endfor %}
    21. ul>
    22. div>
    23. body>
    24. html>

    运行结果:

    •  {{ ... }}:用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的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。
  • 相关阅读:
    C++类和对象 (下)
    985硕的4家大厂实习与校招经历专题分享(part2)
    分布式.性能优化
    layui+java spring 实现图片文件新增到数据库
    Zotero: 扩容
    【PIE-Engine 数据资源】中国叶面积指数(LAI)月度合成产品
    【Java 基础篇】自如应对文本数据:Java缓冲字符流详解
    MySQL学习笔记(1)——简单操作
    日期格式转化成星期几部署到linux显示英文
    geomtextpath | 成功让你的ggplot注释拥有傲人曲线!~
  • 原文地址:https://blog.csdn.net/weixin_44799217/article/details/126323695