直接使用请求¶
到目前为止,你已经通过声明请求的各个部分及其类型来获取所需的数据。
从以下位置获取数据:
- 路径作为参数。
- 请求头。
- 请求的Cookie。
- 等等。
通过这样做,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
。
Tip
请注意,在这种情况下,我们除了声明请求参数外,还声明了一个路径参数。
因此,路径参数将被提取、验证、转换为指定类型,并通过 OpenAPI 进行注释。
同样地,你可以像往常一样声明任何其他参数,并且还可以获取 Request
。
Request
文档¶
你可以在 Starlette 官方文档网站 上阅读更多关于 Request
对象的详细信息。
"技术细节"
你也可以使用 from starlette.requests import Request
。
FastAPI 直接提供它只是为了方便你,开发者。但它直接来自 Starlette。