模板¶
FastAPI 支持多种模板引擎。
Flask 等工具使用的 Jinja2 是最用的模板引擎。
在 Starlette 的支持下,FastAPI 应用可以直接使用工具轻易地配置 Jinja2。
安装依赖项¶
安装 jinja2
:
$ pip install jinja2
---> 100%
如需使用静态文件,还要安装 aiofiles
:
$ pip install aiofiles
---> 100%
使用 Jinja2Templates
¶
- 导入
Jinja2Templates
- 创建可复用的
templates
对象 - 在返回模板的路径操作中声明
Request
参数 - 使用
templates
渲染并返回TemplateResponse
, 以键值对方式在 Jinja2 的 context 中传递request
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}
)
笔记
注意,必须为 Jinja2 以键值对方式在上下文中传递 request
。因此,还要在路径操作中声明。
提示
通过声明 response_class=HTMLResponse
,API 文档就能识别响应的对象是 HTML。
技术细节
您还可以使用 from starlette.templating import Jinja2Templates
。
FastAPI 的 fastapi.templating
只是为开发者提供的快捷方式。实际上,绝大多数可用响应都直接继承自 Starlette。 Request
与 StaticFiles
也一样。
编写模板¶
编写模板 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>
它会显示从 context 字典中提取的 id
:
{"request": request, "id": id}
模板与静态文件¶
在模板内部使用 url_for()
,例如,与挂载的 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>
本例中,使用 url_for()
为模板添加 CSS 文件 static/styles.css
链接:
h1 {
color: green;
}
因为使用了 StaticFiles
, FastAPI 应用自动提供位于 URL /static/styles.css
的 CSS 文件。
更多说明¶
包括测试模板等更多详情,请参阅 Starlette 官档 - 模板。