当前位置:   article > 正文

python - flask 之 jinja2渲染模块详细介绍_jinjia2 render

jinjia2 render

目录

(1)jinja2作用简介

(2)jinja2渲染模板

(3)jinja2变量与变量过滤器

(4)jinja2控制语句

(5)jinja2宏操作

(6)jinja2 block块

(7)jinja2 include语句


 

(1)jinja2作用简介

  • jinja2主要任务是实现html页面的渲染。在flask项目中,业务逻辑由视图函数来完成,而页面逻辑由jinja2渲染模板来完成。
  • jinja2渲染模板通过接收来自视图函数的数据,生成html代码或其他前端框架的代码。

 

(2)jinja2渲染模板

1)Flask如何使用jinja2渲染模板

  • Flask提供render_template()函数把jinja2模板引擎集成到应用中;默认情况下,Flask在templates目录里寻找模板。
  • 所以jinja2模板应存放在templatesh目录中。

2)Flask使用jinja2模板案例

第一步:在templates目录建 index.html 与 user.html 两模板

  1. index.html模板内宾
  2. <h1>Hello World</h1>
  3. user.html模板内容
  4. <h1>Hello,{{name}}!</h1>

第二步:使用render_template()调用模板并传递输入数据

  1. from flask import Flask,render_template
  2. @app.route('/')
  3. def index():
  4. return render_template('index.html')
  5. @app.route('/user/<name>')
  6. def user(name):
  7. return render_template('user.html',name=name)
  8. #render_template()中第1个name 为 user.html模板中的name(模板中变量)
  9. #第2个name 为 @app.route('/user/<name>') 中的name(传递给模板name变量的值)

3)Flask与模板相关的函数

  1. flask.render_template()
  2. 引入模板并向模板传参数
  3. flask.render_template_string()
  4. # Renders a template from the given template source string with the given context.
  5. flask.get_template_attribute(template_name, attribute)
  6. # Loads a macro (or variable) a template exports. This can be used to invoke a macro from within Python code.

 

(3)jinja2变量与变量过滤器

1)定义变量

jinja2模板使用{{name}}表示变量。

jinja2能识别所有类型的变量,例如列表、字典、对象等,如下例:

  • <p>A value from a dictionary: {{mydict['key']}} </p>
  • <p>A value from a list: {{mylist[0]}} </p>
  • <p>A value from a list,with a variable index: {{mylist[myvar]}} </p>
  • <p>A value from an object's method:{{myobj.somemethod()}} </p>

 

2)变量过滤器

[1]字符串操作

  • safe:禁用转义
  • <p>{{ '<em>hello</em>' | safe }}</p>
  • capitalize:把变量值的首字母转成大写,其余字母转小写
  • lower:把值转成小写
  • upper:把值转成大写
  • title:把值中的每个单词的首字母都转成大写
  • reverse:字符串反转
  • <p>{{ 'olleh' | reverse }}</p>
  • format:格式化输出
  • <p>{{ '%s is %d' | format('name',17) }}</p>
  • striptags:渲染之前把值中所有的HTML标签都删掉
  • <p>{{ '<em>hello</em>' | striptags }}</p>
  • truncate: 字符串截断
  • <p>{{ 'hello every one' | truncate(9)}}</p>

 

[2]列表操作

  • first:取第一个元素
  • <p>{{ [1,2,3,4,5,6] | first }}</p>
  • last:取最后一个元素
  • <p>{{ [1,2,3,4,5,6] | last }}</p>
  • length:获取列表长度
  • <p>{{ [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
  • <p>{{ [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
  • <p>{{ [6,2,3,1,5,4] | sort }}</p>

 

[3]语句块操作

  • {% filter upper %} #一大堆文字# {% endfilter %}

 

(4)jinja2控制语句

1)if条件语句

  1. {% if user == 'westos'%}
  2. {% elif user == 'hello'%}
  3. {% else %}
  4. {% endif%}

 

例:

  1. {% if user %}
  2. hello ,{{user}}!
  3. {% else %}
  4. hello ,stranger!
  5. {% endif %}

 

2)for循环语句

  1. #语法案例
  2. {% for i in li%}
  3. {% endfor %}
  4. #案例:迭代列表
  5. <ul>
  6. {% for user in users %}
  7. <li>{{ user.username|title }}</li>
  8. {% endfor %}
  9. </ul>
  10. #案例:迭代字典
  11. <dl>
  12. {% for key, value in my_dict.iteritems() %}
  13. <dt>{{ key }}</dt>
  14. <dd>{{ value}}</dd>
  15. {% endfor %}
  16. </dl>

 

3)for循环特殊变量

  • 在for循环中,jinja2还提供了一些特殊的变量,用以来获取当前的遍历状态:
  • loop.index 当前迭代的索引(从1开始)
  • loop.index0 当前迭代的索引(从0开始)
  • loop.first 是否是第一次迭代,返回bool
  • loop.last 是否是最后一次迭代,返回bool
  • loop.length 序列中的项目数量
  • loop.revindex 到循环结束的次数(从1开始)
  • loop.revindex0 到循环结束的次数(从0开始)

 

(5)jinja2宏操作

jinja2的宏与python中的函数类似,可以传递参数,但没有返回值

 

1)jinja2定义与调用宏

定义宏: {% macro 宏名称(参数) %} 宏内容 {% endmacro %}

调用宏: {{ 宏名称(参数) }}

 

案例1:定义宏带有参数默认值

  1. {% macro input(name, value='', type='text') %}
  2. <input type="{{ type }}" name="{{ name }}" value="{{value|e }}">
  3. {% endmacro %}

案例2:在for循环中使用宏

  1. {% macro render_comment(comment) %}
  2. <li> {{comment}} </li>
  3. {% endmacro %}
  4. <ul>
  5. {% for comment in comments %}
  6. {{ render_comment(comment) }}
  7. {% endfor %}
  8. </ul>

2)jinja2导入宏

实际开发中,很少将宏在同一个页面定义并使用,一般都是放在指定的文件夹中,然后将宏的导入使用。

[1]import...as...

  • {% import 'forms.html' as forms %}
  • {% import "macros/macros.html" as macros %}

[2]from...import...as.../from...import...

  • {% from 'forms.html' import input as input_field %}
  • {% from "macros/macros.html" import input as inp %}

[3]with context

  • 若导入宏时要把当前模版的一些参数传给宏所在的模版,应使用with context
  • import "宏文件的路径" as xxx with context
  • {% from '_helpers.html' import my_macro with context %}

 

(6)jinja2 block块

1)模板的继承

  • 继承有两方面意义:不但继承父模板所有内容,还可以对继承过来的内容进行修改。
  • 关于模板的继承,在子模板的顶部使用如"{% extend ‘base.html’ %}"语句来声明继承。
  • 子模板中"{% block block_name %}"和"{% endblock %}"所包括的语句块,将会替换父模板中同样由"{% block block_name %}"和"{% endblock %}"所包括的语句块。

继承要注意以下两点:

  • 模板不支持多继承,也就是子模板中定义的块,不可能同时替换两个父模板的块。
  • 模板中不能定义同名的块,因为这样无法确认替换块的内容。

说明:

  • 模板是作为 继承页面的底板,继承页面架构是在底板基础上进行修改
  • 在继承页面中,重定义模板的block,将用新定义内容 覆盖 该block原定义的内容; 若不想保留原定义的内容,则使用 {{ super() }}

 

2)block内语句作用域

默认情况下,块内语句是无法访问块外作用域中的变量。比如:

{% for item in range(5) %}

<li>{% block loop_item %}{{ item }}{% endblock %}</li>

{% endfor %}

 

模板中定义”list”块并访问循环中的”item”变量:

这个例子会输出空的 < li> 项,因为 item 在块中是不可用的。

其原因是,如果 块被子模板替换,变量在其块中可能是未定义的或未被传递到上下文。

 

从 Jinja 2.2 开始可以显式地指定在块中可用的变量,只需在块声明中添加 scoped 修饰,就把块设定到作用域中:

{% for item in range(5) %}

<li>{% block loop_item scoped %}{{ item }}{% endblock %}</li>

{% endfor %}

 

3)super()保留父模板的块里的内容

  1. base.html
  2. {% block body %}
  3. hello
  4. {% endblock %}
  5. #use_block.html
  6. {% block body %}
  7. {{ super() }} {# 加载父模板bas.html中 body块内容 #}
  8. <span style="color: green">这是最新填的block内容</span>
  9. {% endblock %}

 

(7)jinja2 include语句

1)include语句作用

  • "{% include %}"语句,其功能就是将另一个模板加载到当前模板中,并直接渲染在当前位置上。
  • 它同导入"import"不一样,"import"之后你还需要调用宏来渲染你的内容,"include"是直接将目标模板渲染出来。
  • 它同block块继承也不一样,它一次渲染整个模板文件内容,不分块。

2)ignore missing

  • {% include 'footer.html' ignore missing %}
  • 加上"ignore missing",若模板不存在则会忽略这段"{% include %}"语句,否则程序会抛出异常。

3)include模板列表

  • {% include ['footer.html','bottom.html','end.html'] ignore missing %}
  • # 上例中,程序会按顺序寻找模板文件,第一个被找到的模板即被加载,而其后的模板都会被忽略。如果都没找到,那整个语句都会被忽略。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/387843
推荐阅读
相关标签
  

闽ICP备14008679号