Saltar al contenido

Usando el Request directamente

Hasta ahora, has estado declarando las partes de la petición 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 en las que 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.

Esto también significa que si obtienes datos del objeto Request directamente (por ejemplo, leer el body) no serán validados, convertidos ni documentados (con OpenAPI, para la interfaz de usuario automática del API) por FastAPI.

Aunque cualquier otro parámetro declarado normalmente (por ejemplo, el body con un modelo Pydantic) seguiría siendo validado, convertido, anotado, etc.

Pero hay casos específicos en los que es útil obtener el objeto Request.

Usa el objeto Request directamente

Imagina que quieres obtener la dirección IP/host del cliente dentro de tu path operation function.

Para eso necesitas acceder a la petición 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 Request, FastAPI sabrá que debe pasar el Request en ese parámetro.

Consejo

Ten en cuenta que en este caso, estamos declarando un parámetro de path además del parámetro request.

Así, 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 además, obtener también el Request.

Documentación de Request

Puedes leer más detalles sobre el objeto Request en el sitio oficial de documentación de Starlette.

Detalles Técnicos

También podrías usar from starlette.requests import Request.

FastAPI lo proporciona directamente como una conveniencia para ti, el desarrollador. Pero viene directamente de Starlette.