Jinja2模板之宏
app.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask,render_template
"""
模板
独立模板
为每一类界面编写独立的模板,如主页模板、用户资料页模板、设置页模板,可以在视图函数中渲染并作为html的响应主体
局部模板
仅包含部分代码,需要将其插入到独立模板中使用
PS:当多个独立模板使用同一块html代码时,可以将此部分抽离出来,存储到局部模板中
例 顶部栏 定义为局部模板 _top.html
插入到其它模板中 {% include '_top.html' %} # 建议为了和普通模板分开,局部模板建议使用下滑线开始
宏
宏(macro)是Jinja2提供的一个非常有用的特性,它类似Python中的函数。使用宏可以把一部分模板代码封装到宏里,使用传递的参数来构建内容,最后返回构建后的内容。
在功能上,它和局部模板类似,都是为了方便代码块的重用。为了便于管理,把宏存储在单独的文件中,这个文件通常命名为macros.html或_macors.html。在创建宏时,
我们使用macro和endmacro标签声明宏的开始和结束。在开始标签中定义宏的名称和接收的参数
PS:
另外,在使用宏时需要注意上下文问题。在Jinja2中,出于性能的考虑,并且为了让这一切保持显式,默认情况下包含(include)个局部模板会传递当前上下文到局部模板中,
但导入(import)却不会。具体来说,当我们使用render_template()函数渲染一个foo.html模板时,这个foo.html的模板上下文中包含以下对象
1、Fask使用内置的模板上下文处理函数提供的g、 Session、 config、 request。
2、扩展使用内置的模板上下文处理函数提供的变量。
3、自定义模板上下文处理器传入的变量。
4、使用render_template()函数传入的变量。
5、Jinja2和Flask内置及自定义全局对象。
6、Jinja2内置及自定义过滤器。
7、Jinja2内置及自定义测试器。
使用include标签插入的局部模板(比如_banner.html)同样可以使用上述上下文中的变量和函数。而导入另一个并非被直接渲染的模板(比如macros.html)时,模板仅包含下列这些对象:
1、Jinja2和Flask内置的全局函数和自定义全局函数。
2、Jinja2内置及自定义过滤器。
3、Jinja2内置及自定义测试器。
故如果想在导入的宏中使用第一列表中的2,3,4项,就需要在导入时显示的使用with context声明传入当前模板的上下文
{% from "_macros.html" import foo with context %}
宏相关:http://jinja.pocoo.org/docs/2.10/templates/#macros
"""
app = Flask(__name__)
@app.route('/')
def index():
"""宏示例"""
user = {'user': 'gg', 'burs': 'you love'}
mours = [{'name': 1, 'year': "ss"}, {'name': 2, 'year': "uu"}]
return render_template("templations.html",user=user,mours=mours)
if __name__ == '__main__':
app.run()
templations.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{user.user}}</title>
</head>
<body>
<h2>{{user.user}}</h2>
{% if user.burs %}
<i>{{user.burs}}</i>
{% else %}
<i>233333</i>
{% endif %}
<ul>
{% for mouv in mours %}
<li>{{mouv.name}}--{{mouv.year}}</li>
{% endfor %}
</ul>
{# 像从python模块中导入函数一样使用import语句导入,然后作为函数调用,传入必要的参数 #}
{% from '_macors.html' import qux %}
{{ qux(amount=4) }}
</body>
</html>
_macors.html
{% macro qux(amount=1) %}
{% if amount == 1 %}
amount == 1
{% elif amount > 1 %}
amount > 1
{% endif %}
{% endmacro %}