直接使用 Request¶
到目前为止,您一直通过声明所需的请求部分及其类型来使用它们。
从路径中获取数据作为参数。
- 路径作为参数。
- 请求头。
- 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。