docs/es/docs/how-to/custom-request-and-route.md MARKDOWN 110 lines View on github.com → Search inside
1# Clase personalizada de Request y APIRoute { #custom-request-and-apiroute-class }23En algunos casos, puede que quieras sobrescribir la lógica utilizada por las clases `Request` y `APIRoute`.45En particular, esta puede ser una buena alternativa a la lógica en un middleware.67Por ejemplo, si quieres leer o manipular el request body antes de que sea procesado por tu aplicación.89/// danger | Advertencia1011Esta es una funcionalidad "avanzada".1213Si apenas estás comenzando con **FastAPI**, quizás quieras saltar esta sección.1415///1617## Casos de uso { #use-cases }1819Algunos casos de uso incluyen:2021* Convertir request bodies no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).22* Descomprimir request bodies comprimidos con gzip.23* Registrar automáticamente todos los request bodies.2425## Manejo de codificaciones personalizadas de request body { #handling-custom-request-body-encodings }2627Veamos cómo hacer uso de una subclase personalizada de `Request` para descomprimir requests gzip.2829Y una subclase de `APIRoute` para usar esa clase de request personalizada.3031### Crear una clase personalizada `GzipRequest` { #create-a-custom-gziprequest-class }3233/// tip | Consejo3435Este es un ejemplo de juguete para demostrar cómo funciona, si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.3637///3839Primero, creamos una clase `GzipRequest`, que sobrescribirá el método `Request.body()` para descomprimir el request body si hay un header apropiado.4041Si no hay `gzip` en el header, no intentará descomprimir el request body.4243De esa manera, la misma clase de ruta puede manejar requests comprimidos con gzip o no comprimidos.4445{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}4647### Crear una clase personalizada `GzipRoute` { #create-a-custom-gziproute-class }4849A continuación, creamos una subclase personalizada de `fastapi.routing.APIRoute` que hará uso de `GzipRequest`.5051Esta vez, sobrescribirá el método `APIRoute.get_route_handler()`.5253Este método devuelve una función. Y esa función es la que recibirá un request y devolverá un response.5455Aquí lo usamos para crear un `GzipRequest` a partir del request original.5657{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[19:27] *}5859/// note | Detalles técnicos6061Un `Request` tiene un atributo `request.scope`, que es simplemente un `dict` de Python que contiene los metadatos relacionados con el request.6263Un `Request` también tiene un `request.receive`, que es una función para "recibir" el body del request.6465El `dict` `scope` y la función `receive` son ambos parte de la especificación ASGI.6667Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva instance de `Request`.6869Para aprender más sobre el `Request`, revisa [la documentación de Starlette sobre Requests](https://starlette.dev/requests/).7071///7273La única cosa que la función devuelta por `GzipRequest.get_route_handler` hace diferente es convertir el `Request` en un `GzipRequest`.7475Haciendo esto, nuestro `GzipRequest` se encargará de descomprimir los datos (si es necesario) antes de pasarlos a nuestras *path operations*.7677Después de eso, toda la lógica de procesamiento es la misma.7879Pero debido a nuestros cambios en `GzipRequest.body`, el request body se descomprimirá automáticamente cuando sea cargado por **FastAPI** si es necesario.8081## Accediendo al request body en un manejador de excepciones { #accessing-the-request-body-in-an-exception-handler }8283/// tip | Consejo8485Para resolver este mismo problema, probablemente sea mucho más fácil usar el `body` en un manejador personalizado para `RequestValidationError` ([Manejo de Errores](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)).8687Pero este ejemplo sigue siendo válido y muestra cómo interactuar con los componentes internos.8889///9091También podemos usar este mismo enfoque para acceder al request body en un manejador de excepciones.9293Todo lo que necesitamos hacer es manejar el request dentro de un bloque `try`/`except`:9495{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}9697Si ocurre una excepción, el instance de `Request` todavía estará en el alcance, así que podemos leer y hacer uso del request body cuando manejamos el error:9899{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}100101## Clase personalizada `APIRoute` en un router { #custom-apiroute-class-in-a-router }102103También puedes establecer el parámetro `route_class` de un `APIRouter`:104105{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *}106107En este ejemplo, las *path operations* bajo el `router` usarán la clase personalizada `TimedRoute`, y tendrán un header `X-Response-Time` extra en el response con el tiempo que tomó generar el response:108109{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *}

Findings

✓ No findings reported for this file.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.

Generated by searchcode.com · powered by code_get_file + code_get_findings