Fastapi 简明教程

FastAPI - Templates

默认情况下,FastAPI 会向客户端呈现 JSON 响应。但是,它可以转换为 HTML 响应。为此,FastAPI 在 fastapi.responses 模块中定义了 HTMLResponse 类。我们需要向操作装饰器添加 response_class 作为附加参数,并以 HTMLResponse 对象作为其值。

在以下示例中,@app.get() 装饰器的“/hello/”端点和 HTMLResponse 为 response_class。在 hello() 函数中,我们有一个 Hello World 消息的 HTML 代码的字符串表示。字符串以 HTML 响应的形式返回。

from fastapi.responses import HTMLResponse
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello/")
async def hello():
   ret='''
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
'''
   return HTMLResponse(content=ret)

检查 API 文档时,可以看到服务器的响应主体为 HTML。

template1

请求 URL ([role="bare"] [role="bare"]http://localhost:8000/hello/ ) 也应该在浏览器中呈现该消息。但是,呈现原始 HTML 响应非常繁琐。或者,可以将预先构建的 HTML 页面呈现为模板。为此,我们需要使用 Web 模板库。

Web 模板库具有一个模板引擎,它合并带有占位符变量的静态 Web 页面。来自任何来源(如数据库)的数据被合并,以动态生成和呈现 Web 页面。FastAPI 没有任何预先打包的模板库。因此,可以自由使用任何适合自己需要的一个。在本教程中,我们将使用 jinja2 ,一个非常流行的 Web 模板库。让我们首先使用 pip 安装程序安装它。

pip3 install jinja2

FastAPI 对 Jinja 模板的支持以 fastapi.templates 模块中定义的 jinja2Templates 类形式出现。

from fastapi.templating import Jinja2Templates

要声明一个模板对象,应该提供存储 html 模板的文件夹作为参数。在当前工作目录中,我们将创建一个 ‘templates’ 目录。

templates = Jinja2Templates(directory="templates")

一个简单的 Web 页面 ‘hello.html’ 来呈现 Hello World 消息也放在 ‘templates’ 文件夹中。

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

我们现在将从此页面呈现 html 代码作为 HTMLResponse。让我们修改 hello() 函数,如下所示:

from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import FastAPI, Request
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/hello/", response_class=HTMLResponse)
async def hello(request: Request):
   return templates.TemplateResponse("hello.html", {"request": request})

此处,模板对象的 templateResponse() 方法收集模板代码和请求上下文来呈现 http 响应。当我们启动服务器并访问 [role="bare"] [role="bare"]http://localhost:8000/hello/ URL 时,我们将在浏览器中看到 Hello World 消息,它实际上是 hello.html 的输出。

template2

如前所述,jinja2 模板允许将某些占位符嵌入到 HTML 代码中。jinja2 代码元素放在大括号内。一旦浏览器的 HTML 解析器遇到这种情况,模板引擎就会接管,并通过 HTTP 响应提供的变量数据填充这些代码元素。Jinja2 提供以下代码元素:

  1. {% %} – Statements

  2. {{ }} - 输送到模板输出的表达式

  3. {# #} - 未包含在模板输出中的注释

  4. # # # - 行语句

hello.html 已修改为如下内容,用于通过替换名称参数来显示动态消息。

<html>
<body>
<h2>Hello {{name}} Welcome to FastAPI</h2>
</body>
</html>

操作函数 hello() 也已修改为接受名称作为路径参数。 TemplateResponse 还应包括 “name”:name 的 JSON 表示和请求上下文。

from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi import FastAPI, Request
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/hello/{name}", response_class=HTMLResponse)
async def hello(request: Request, name:str):
   return templates.TemplateResponse("hello.html", {"request": request, "name":name})

重新启动服务器,并转到 [role="bare"] [role="bare"]http://localhost:8000/hello/Kiran 。浏览器现在用此 URL 中的路径参数填充 jinja2 占位符。

template3