From d9d46bcd77da2666cbd456c7344c011ce211816c Mon Sep 17 00:00:00 2001 From: PabloCM83 Date: Sat, 6 Jan 2024 23:28:18 -0500 Subject: [PATCH] Add Spanish translation for docs/es/docs/tutorial/body.md - Version >= 0.108.0 --- docs/es/docs/tutorial/body.md | 213 ++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 docs/es/docs/tutorial/body.md diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md new file mode 100644 index 0000000000..8afa7df374 --- /dev/null +++ b/docs/es/docs/tutorial/body.md @@ -0,0 +1,213 @@ +# Cuerpo de la Petición + +Cuando necesitas enviar datos desde un cliente (digamos, un navegador) a tu API, los envías como un **cuerpo de la petición**. + +Un cuerpo de **petición** son datos enviados por el cliente a la API. Un cuerpo de **respuesta** son los datos que la API envía al cliente. + +Tu API casi siempre tiene que enviar un cuerpo de **respuesta**. Pero los clientes no necesariamente necesitan enviar cuerpos de **petición** todo el tiempo. + +Para declarar un cuerpo de **petición**, utiliza modelos Pydantic con todo su potencial y beneficios. + +!!! info "Información" + Para enviar datos, debes usar uno de: `POST` (el más común), `PUT`, `DELETE` o `PATCH`. + + Enviar un cuerpo con una petición `GET` tiene un comportamiento indefinido en las especificaciones, sin embargo, es compatible con FastAPI, solo para casos de uso muy complejos/extremos. + + Como no es recomendado, las documentaciones interactivas de Swagger UI no mostrarán la documentación del cuerpo cuando se use `GET`, y es posible que los servidores proxy en el medio no lo admitan. + +## Importar `BaseModel` de Pydantic + +Primero, necesitas importar `BaseModel` desde `pydantic`: + +=== "Python 3.10+" + + ```Python hl_lines="2" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +## Crea tu modelo de datos + +Después declara tu modelo de datos como una clase que hereda de `BaseModel`. + +Utiliza tipos estándar de Python para todos los atributos: + +=== "Python 3.10+" + + ```Python hl_lines="5-9" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="7-11" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +Lo mismo que cuando se declaran parámetros de consulta, cuando un atributo del modelo tiene un valor predeterminado, no es obligatorio. En caso contrario, es obligatorio. Utiliza `None` para que sea opcional. + +Por ejemplo, este modelo declara un "`objeto`" JSON (o un `dict` de Python) como: + +```JSON +{ + "name": "Foo", + "description": "An optional description", + "price": 45.2, + "tax": 3.5 +} +``` + +...como `description` y `tax` son opcionales (con un `None` como valor por defecto), este "`objeto`" JSON "`object`" también sería válido: + +```JSON +{ + "name": "Foo", + "price": 45.2 +} +``` + +## Decláralo como parámetro + +Para agregarlo a su *operación de ruta*, decláralo de la misma manera que declaró los parámetros de la ruta y de la consulta: + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial001_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial001.py!} + ``` + +...y declara su tipo como el modelo que creaste, `Item`. + +## Resultados + +Con solo esa declaración de tipo Python, **FastAPI** hará lo siguiente: + +* Lee el cuerpo de la petición como JSON. +* Convierte los tipos correspondientes (si es necesario). +* Valida los datos. + * Si los datos no son válidos, devolverá un error bonito y claro, indicando exactamente dónde y cuál fue el dato incorrecto. +* Te dará los datos recibidos en el parámetro `item`. + * Como lo declaraste en la función como de tipo `Item`, también tendrás todo el soporte del editor (completado, etc.) para todos los atributos y sus tipos. +* Genera definiciones del Esquema JSON para su modelo, que también podrás usarlas en cualquier otro lugar que desees si tiene sentido para tu proyecto. +* Esos esquemas formarán parte del esquema OpenAPI generado y serán utilizados por la documentación automática de las UIs. + +## Documentación automática + +Los Esquemas JSON de tus modelos serán parte de su esquema generado por OpenAPI y se mostrarán en las documentaciones interactivas de la API.: + + + +Y también se usará en la documentación de la API dentro de cada *operación de ruta* que los necesite: + + + +## Soporte del editor + +En tu editor, dentro de tu función obtendrás sugerencias de tipo y completamiento en todas partes (esto no sucedería si recibiera un `dict` en lugar de un modelo Pydantic): + + + +También obtienes comprobaciones de errores para operaciones incorrectas de tipo: + + + +Esto no es casualidad, todo el framework se construyó en torno a ese diseño. + +Y se probó minuciosamente en la fase de diseño, antes de cualquier implementación, para garantizar que funcionara con todos los editores. + +Incluso hubo algunos cambios en el propio Pydantic para respaldar esto. + +Las capturas de pantalla anteriores fueron tomadas con Visual Studio Code. + +Pero obtendrías el mismo soporte de editor con PyCharm y la mayoría de los otros editores de Python: + + + +!!! tip "Consejo" + Sí usas PyCharm como tu editor, puedes usar Pydantic PyCharm Plugin. + + Esto mejora el soporte del editor para modelos Pydantic, con: + + * autocompletado + * chequeo de tipo + * refactorización + * busquedas + * inspecciones + +## Usa el modelo + +Dentro de la función, puedes acceder a todos los atributos del modelo de objeto directamente: + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/body/tutorial002_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="21" + {!> ../../../docs_src/body/tutorial002.py!} + ``` + +## Cuerpo de la Petición + parámetros de ruta + +Puedes declarar parámetros de ruta y cuerpo de la petición al mismo tiempo. + +**FastAPI** reconocerá que los parámetros de función que coinciden con los parámetros de la ruta deben **tomarse de la ruta**, y que los parámetros de función que se declaran como modelos de Pydantic deben **tomarse del cuerpo de la petición o solicitud**. + +=== "Python 3.10+" + + ```Python hl_lines="15-16" + {!> ../../../docs_src/body/tutorial003_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="17-18" + {!> ../../../docs_src/body/tutorial003.py!} + ``` + +## Cuerpo de la Petición + ruta + parámetros de consulta + +Puedes declarar **cuerpo**, parámetros de **ruta** y **consulta**, todos al mismo tiempo. + +**FastAPI** reconocerá cada uno de ellos y tomará los datos del lugar correcto. + +=== "Python 3.10+" + + ```Python hl_lines="16" + {!> ../../../docs_src/body/tutorial004_py310.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/body/tutorial004.py!} + ``` + +Los parámetros de la función se reconocerán de la siguiente manera: + +* Si el parámetro también se declara en **ruta**, se utilizará como parámetro de ruta. +* Si el parámetro es de **tipo singular** (como `int`, `float`, `str`, `bool`, etc.) se interpretará como un parámetro de **consulta**. +* Si el parámetro se declara como del tipo de **modelo Pydantic**, se interpretará como un **cuerpo** de la petición. + +!!! note "Nota" + FastAPI sabrá que el valor de `q` no es necesario debido al valor predeterminado `= None`. + + FastAPI no utiliza `Union` en `Union[str, None]`, pero permitirá que su editor le brinde un mejor soporte y detecte errores. + +## Sin Pydantic + +Si no deseas utilizar modelos de Pydantic, también puedes utilizar los parámetros **Body**. Consulta la documentación para [Cuerpo - Múltiples parámetros: valores singulares en el cuerpo](body-multiple-params.md#valores-singulares-en-el-cuerpo){.internal-link target=_blank}.