#1304·jinja

能够编写使用 async/await 的 Jinja 加载器

作者: simonw创建于 2020年10月30日更新于 2026年1月14日

我正在一个异步框架中编写代码,使用了 Jinja 的出色的异步模式。我想编写一个自定义模板加载器,可以从数据库异步加载模板 - 但据我所知, Jinja 的加载器机制只适用于同步函数。借用一个示例 来自这里,我希望能够做到以下内容:

python
async def load_template(name):
    row = await db.execute("select body from templates where name = ?", name)
    return row[0]
loader = FunctionLoader(load_template)

最初,我通过在自己的代码中异步加载模板,并使用 jinja_env.from_string(plugin_template_source) 为 Jinja 编译它们,来解决了这个问题 - 但后来我意识到,由于 {% extends ... %}{% include ... %} 块, Jinja 内部加载的模板无法使用。如果这是一个 Jinja 维护者认为应作为库的一部分的功能,我很乐意帮助实现它。