模板扩展点

描述

这个扩展点缩写为tep。

顾名思义,tep仅适用于模板环境,用于增强或扩展现有模板。它可以是简单的html代码或复杂的html文件,需要由用户在现有模板中手动调用。

插件需要通过register返回tep字段,返回的tep数据类型是一个格式为{tep_name: html_code_or_file}的字典,且可以有多个tep_name。

Flask-PluginKit通过 _tep_handler() 加载tep,此方法将检测tep规则和内容。如果tep_name对应的值以 .html.htm.xhtml 结尾,则会认定为模板文件,否则便是html代码。

虽然每个插件返回的tep中的tep_name是唯一的,但由于Web应用程序可以有多个插件,因此对整个Web应用程序来说,tep_name不仅会包含html代码,还包含模板文件。

使用时,在现有模板中,tep_name对应的所有内容都通 emit_tep() 调用,其中,模板文件通过 flask.render_template() 渲染,html代码通过 flask.render_template_string() 渲染。这意味着,html代码也可以像模板文件一样支持jinja2语法、函数、宏等,此外,使用emit_tep可以传递typ参数设置仅渲染HTML代码或模板文件,而且可以传递额外的关键字参数给tep_name,作为渲染的上下文数据。

小技巧

模板文件支持排序。你需要在初始化 PluginManager 时设置 stpl = True。用法是 “排序字段@模板文件”。

备注

如果有模板文件,建议您在插件目录的templates下创建一个子目录以存储html文件,因为Flask-PluginKit只加载插件下的templates目录,并且不保证模板冲突,所以在templates下创建子目录可以尽可能地避免与其他插件模板文件冲突,以免文件无法正确引用。

示例

  • 注册tep

def register():
    return dict(
        tep=dict(
            base_header="example/header.html",
            base_footer="Copyright 2019."
        )
    )

如上所述,您需要在插件中创建一个新的”templates/example”目录,并将header.html放入目录中,如果它不存在,那么会抛出异常: TemplateNotFound

  • 在模板中调用

在现有模板中,假设以下文件名为base.html是基础模板,用户需要手动调用 emit_tep() ,可以传递额外的数据:

<html>
<head>
    {{ emit_tep("base_header", extra=dict(a=1, b=True, c=[])) }}
</head>
<body>
    {{ emit_tep("base_footer") }}
</body>
</html>