直接使用请求对象¶
到目前为止,您一直在通过类型声明来获取所需的请求部分。
从以下位置获取数据:
- 路径参数
- 请求头
- 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。