模板扩展点¶
描述¶
这个扩展点缩写为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>