jinja2 TemplateResponse.template.render() 不会将上下文注入模板

jinja2 TemplateResponse.template.render() doesn't inject context into template

我在 Jinja2 中使用 FastAPI。

我有一个发送电子邮件的功能。电子邮件的内容在需要呈现的 HTML 中。

    async def send_confirmation_email(
        self, email: str, confirm_url: str, request: Request
    ):
        html = templates.TemplateResponse(
            "email_template.html",
            {
                "request": request,
                "header": "Thanks for joining",
                "url": confirm_url,
                "link_title": "ACTIVATE YOUR ACCOUNT",
            },
        )
        await self.send_email(
            html.template.render(),
            "Confirm Your Email",
            setting.EMAIL_SUPPORT,
            email,
        )

html.template.render() 仅呈现 HTML 的内容,而没有将上下文填充到占位符中。例如"header": "Thanks for joining" 仍然是空的。

来自 HTML 的片段:

<td align="center" width="120" colspan="3" valign="top"><h2>{{ header }}</h2></td>

请问我错过了什么?

TemplateResponse return 一个 starlette.responses.Response,不是渲染器模板。

为此,您需要使用

templates.get_template("email_template.html").render({
    "request": request,
    "header": "Thanks for joining",
    "url": confirm_url,
    "link_title": "ACTIVATE YOUR ACCOUNT",
})

(参考:https://github.com/encode/starlette/blob/master/starlette/templating.py#L72