赞
踩
目录
1)Flask如何使用jinja2渲染模板
2)Flask使用jinja2模板案例
第一步:在templates目录建 index.html 与 user.html 两模板
- index.html模板内宾
-
- <h1>Hello World</h1>
-
- user.html模板内容
-
- <h1>Hello,{{name}}!</h1>
第二步:使用render_template()调用模板并传递输入数据
- from flask import Flask,render_template
-
- @app.route('/')
- def index():
- return render_template('index.html')
-
- @app.route('/user/<name>')
- def user(name):
- return render_template('user.html',name=name)
- #render_template()中第1个name 为 user.html模板中的name(模板中变量)
- #第2个name 为 @app.route('/user/<name>') 中的name(传递给模板name变量的值)
3)Flask与模板相关的函数
- flask.render_template()
-
- 引入模板并向模板传参数
-
- flask.render_template_string()
-
- # Renders a template from the given template source string with the given context.
-
- flask.get_template_attribute(template_name, attribute)
-
- # Loads a macro (or variable) a template exports. This can be used to invoke a macro from within Python code.
1)定义变量
jinja2模板使用{{name}}表示变量。
jinja2能识别所有类型的变量,例如列表、字典、对象等,如下例:
2)变量过滤器
[1]字符串操作
[2]列表操作
[3]语句块操作
1)if条件语句
- {% if user == 'westos'%}
-
- {% elif user == 'hello'%}
-
- {% else %}
-
- {% endif%}
例:
- {% if user %}
-
- hello ,{{user}}!
-
- {% else %}
-
- hello ,stranger!
-
- {% endif %}
2)for循环语句
- #语法案例
-
- {% for i in li%}
-
- {% endfor %}
-
-
-
- #案例:迭代列表
-
- <ul>
-
- {% for user in users %}
-
- <li>{{ user.username|title }}</li>
-
- {% endfor %}
-
- </ul>
-
-
-
- #案例:迭代字典
-
- <dl>
-
- {% for key, value in my_dict.iteritems() %}
-
- <dt>{{ key }}</dt>
-
- <dd>{{ value}}</dd>
-
- {% endfor %}
-
- </dl>
3)for循环特殊变量
jinja2的宏与python中的函数类似,可以传递参数,但没有返回值
1)jinja2定义与调用宏
定义宏: {% macro 宏名称(参数) %} 宏内容 {% endmacro %}
调用宏: {{ 宏名称(参数) }}
案例1:定义宏带有参数默认值
- {% macro input(name, value='', type='text') %}
-
- <input type="{{ type }}" name="{{ name }}" value="{{value|e }}">
-
- {% endmacro %}
案例2:在for循环中使用宏
- {% macro render_comment(comment) %}
-
- <li> {{comment}} </li>
-
- {% endmacro %}
-
-
-
- <ul>
-
- {% for comment in comments %}
-
- {{ render_comment(comment) }}
-
- {% endfor %}
-
- </ul>
-
2)jinja2导入宏
实际开发中,很少将宏在同一个页面定义并使用,一般都是放在指定的文件夹中,然后将宏的导入使用。
[1]import...as...
[2]from...import...as.../from...import...
[3]with context
1)模板的继承
继承要注意以下两点:
说明:
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()保留父模板的块里的内容
- base.html
-
- {% block body %}
-
- hello
-
- {% endblock %}
-
-
-
- #use_block.html
-
- {% block body %}
-
- {{ super() }} {# 加载父模板bas.html中 body块内容 #}
-
- <span style="color: green">这是最新填的block内容</span>
-
- {% endblock %}
-
1)include语句作用
2)ignore missing
3)include模板列表
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。