跳到内容

直接使用请求

到目前为止,您已经在使用类型声明您需要的请求部分。

从以下位置获取数据:

  • 路径作为参数。
  • 请求头。
  • Cookies。
  • 等等。

通过这样做,FastAPI 会自动验证、转换这些数据并为您的 API 生成文档。

但在某些情况下,您可能需要直接访问 Request 对象。

关于 Request 对象的详细信息

由于 FastAPI 实际上底层是 Starlette,在其上构建了多层工具,因此您可以在需要时直接使用 Starlette 的 Request 对象。

这也意味着,如果您直接从 Request 对象获取数据(例如,读取请求体),FastAPI 将不会对其进行验证、转换或文档化(使用 OpenAPI,用于自动 API 用户界面)。

尽管任何其他正常声明的参数(例如,使用 Pydantic 模型的请求体)仍将得到验证、转换、注解等。

但在某些特定情况下,获取 Request 对象会非常有用。

直接使用 Request 对象

假设您想在您的 *路径操作函数* 中获取客户端的 IP 地址/主机。

为此,您需要直接访问请求。

from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

通过将 *路径操作函数* 参数声明为 `Request` 类型,FastAPI 将知道把 `Request` 传递给该参数。

提示

请注意,在这种情况下,我们在请求参数旁边声明了一个路径参数。

因此,路径参数将被提取、验证、转换为指定类型并用 OpenAPI 进行注解。

同样地,您可以像往常一样声明任何其他参数,并且额外地获取 `Request`。

Request 文档

您可以在 Starlette 官方文档网站 上阅读有关 `Request` 对象的更多详细信息。

技术细节

您也可以使用 `from starlette.requests import Request`。

FastAPI 直接提供它只是为了方便您,作为开发者。但它直接来源于 Starlette。