Usar el Request Directamente¶
Hasta ahora, has estado declarando las partes del request que necesitas con sus tipos.
Tomando datos de:
- El path como parámetros.
- Headers.
- Cookies.
- etc.
Y al hacerlo, FastAPI está validando esos datos, convirtiéndolos y generando documentación para tu API automáticamente.
Pero hay situaciones donde podrías necesitar acceder al objeto Request
directamente.
Detalles sobre el objeto Request
¶
Como FastAPI es en realidad Starlette por debajo, con una capa de varias herramientas encima, puedes usar el objeto Request
de Starlette directamente cuando lo necesites.
También significa que si obtienes datos del objeto Request
directamente (por ejemplo, leyendo el cuerpo) no serán validados, convertidos o documentados (con OpenAPI, para la interfaz automática de usuario de la API) por FastAPI.
Aunque cualquier otro parámetro declarado normalmente (por ejemplo, el cuerpo con un modelo de Pydantic) seguiría siendo validado, convertido, anotado, etc.
Pero hay casos específicos donde es útil obtener el objeto Request
.
Usa el objeto Request
directamente¶
Imaginemos que quieres obtener la dirección IP/host del cliente dentro de tu path operation function.
Para eso necesitas acceder al request directamente.
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}
Al declarar un parámetro de path operation function con el tipo siendo Request
, FastAPI sabrá pasar el Request
en ese parámetro.
Consejo
Nota que en este caso, estamos declarando un parámetro de path además del parámetro del request.
Así que, el parámetro de path será extraído, validado, convertido al tipo especificado y anotado con OpenAPI.
De la misma manera, puedes declarar cualquier otro parámetro como normalmente, y adicionalmente, obtener también el Request
.
Documentación de Request
¶
Puedes leer más detalles sobre el objeto Request
en el sitio de documentación oficial de Starlette.
Detalles Técnicos
Podrías también usar from starlette.requests import Request
.
FastAPI lo proporciona directamente solo como conveniencia para ti, el desarrollador. Pero viene directamente de Starlette.