我正在尝试在烧瓶应用程序中添加类似于wordpress钩子的功能。
我的意思是你可以在模板中定义扩展点,其中插件可以注册回调以添加/修改输出。
这很疯狂,我知道这是我不应该做的事情,但无论如何我都想尝试。
基本上,会使用类似的东西调用一个钩子:
{{do('before_title')}}
<h1>{{title}}</h1>
{{do('after_title')}}
Hooks可以注册:
hooked = defaultdict(lambda: [])
def do(event, *args):
return (cback(*args) for cback in hooked[event])
def add_action(event, cback):
hooked[event].append(cback)
app.jinja_env.globals['do'] = do
注册钩子时,代码看起来像这样:
def print_stuff():
return 'some stuff to print'
add_action('before_title', print_stuff)
我想知道是否可以使用jinja环境直接打印输出,因为,现在,如果必须在模板中循环,并且它不会产生有趣的api。
如果我可以注册这样的东西也很酷:
def print_template(template):
# some magically obtained object representing the jinja template or env
template.include('before_title.html')
add_action('before_title', print_template)
答案 0 :(得分:0)
实际上很简单。
def include_template():
return render_template('partials/before_title.html')
add_action('before_title', include_template)
和
def do(event, *args):
return ''.join(cback(*args) for cback in hooked[event])