在Flask / Jinja中,如何为扩展/插件提供更改模板的钩子?

时间:2018-01-31 20:29:35

标签: python flask jinja2

我正在尝试在烧瓶应用程序中添加类似于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)

1 个答案:

答案 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])