跳到内容

模板

你可以搭配任何你想要的模板引擎使用 FastAPI

一个常见的选择是 Jinja2,与 Flask 和其他工具使用的相同。

有一些可以轻松配置它的工具,你可以直接在你的 FastAPI 应用程序中使用(由 Starlette 提供)。

安装依赖

请确保你创建一个 虚拟环境,激活它,并安装 jinja2

$ pip install jinja2

---> 100%

使用 Jinja2Templates

  • 导入 Jinja2Templates
  • 创建一个 templates 对象,你可以在之后复用它。
  • 路径操作中声明一个 Request 参数,它会返回模板。
  • 使用你创建的 templates 来渲染并返回一个 TemplateResponse,传入模板名称、请求对象和一个用于 Jinja2 模板内部的“上下文”字典,其中包含键值对。
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")


templates = Jinja2Templates(directory="templates")


@app.get("/items/{id}", response_class=HTMLResponse)
async def read_item(request: Request, id: str):
    return templates.TemplateResponse(
        request=request, name="item.html", context={"id": id}
    )

注意

在 FastAPI 0.108.0 和 Starlette 0.29.0 之前,name 是第一个参数。

此外,在此之前,在早期版本中,request 对象是作为 Jinja2 上下文中的键值对的一部分传递的。

提示

通过声明 response_class=HTMLResponse,文档 UI 将能够知道响应将是 HTML。

技术细节

你也可以使用 from starlette.templating import Jinja2Templates

FastAPI 提供了与 starlette.templating 相同的 fastapi.templating,仅仅是为了方便开发者。但大多数可用的响应直接来自 Starlette。RequestStaticFiles 也是如此。

编写模板

然后你可以在 templates/item.html 写入模板,例如

<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1><a href="{{ url_for('read_item', id=id) }}">Item ID: {{ id }}</a></h1>
</body>
</html>

模板上下文值

在包含以下内容的 HTML 中

Item ID: {{ id }}

...它将显示从你传入的“上下文” dict 中获取的 id

{"id": id}

例如,如果 ID 为 42,这将渲染出

Item ID: 42

模板 url_for 参数

你还可以在模板内部使用 url_for(),它接受与你的路径操作函数会使用的相同参数。

因此,包含以下内容的章节

<a href="{{ url_for('read_item', id=id) }}">

...将生成一个链接到由路径操作函数 read_item(id=id) 处理的相同 URL。

例如,如果 ID 为 42,这将渲染出

<a href="/items/42">

模板和静态文件

你还可以在模板内部使用 url_for(),并用它来,例如,搭配你用 name="static" 挂载的 StaticFiles

<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1><a href="{{ url_for('read_item', id=id) }}">Item ID: {{ id }}</a></h1>
</body>
</html>

在这个例子中,它会链接到 static/styles.css 的 CSS 文件,其中包含

h1 {
    color: green;
}

而且因为你正在使用 StaticFiles,该 CSS 文件将由你的 FastAPI 应用程序在 URL /static/styles.css 自动提供。

更多细节

有关更多细节,包括如何测试模板,请查看 Starlette 关于模板的文档