Flask框架9(Jinja2模板宏相关)

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 %}

 

posted @ 2019-04-09 15:07  争-渡  阅读(152)  评论(0)    收藏  举报