一、准备
使用前需要先安装jinja2这个包
pip install jinja2
二、使用jinja2
- 导入
Jinja2Templates - 创建可复用的
templates对象 - 在返回模板的路径操作中声明
Request参数 - 使用
templates渲染并返回TemplateResponse, 传递模板的名称、request对象以及一个包含多个键值对(用于Jinja2模板)的”context”字典,
三、代码用例
程序文件
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") # 实例化jinja2模板引擎,制定了模板文件存放目录。
@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}
)
模板文件
编写模板 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 }}
…这将显示你从”context”字典传递的 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, FastAPI 应用会自动提供位于 URL /static/styles.css的 CSS 文件。