diff --git a/docs/es/docs/advanced/advanced-python-types.md b/docs/es/docs/advanced/advanced-python-types.md index a18c5d6cc8..fcd6c6ff57 100644 --- a/docs/es/docs/advanced/advanced-python-types.md +++ b/docs/es/docs/advanced/advanced-python-types.md @@ -13,12 +13,12 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` `typing` también tiene un atajo para declarar que algo podría ser `None`, con `Optional`. -Aquí va un Consejo desde mi punto de vista muy subjetivo: +Aquí va un Consejo desde mi punto de vista muy **subjetivo**: * 🚨 Evita usar `Optional[SomeType]` * En su lugar ✨ **usa `Union[SomeType, None]`** ✨. diff --git a/docs/es/docs/advanced/async-tests.md b/docs/es/docs/advanced/async-tests.md index 500baf3644..a126ef6a8f 100644 --- a/docs/es/docs/advanced/async-tests.md +++ b/docs/es/docs/advanced/async-tests.md @@ -20,7 +20,7 @@ El `TestClient` está basado en [HTTPX](https://www.python-httpx.org), y afortun ## Ejemplo { #example } -Para un ejemplo simple, consideremos una estructura de archivos similar a la descrita en [Aplicaciones Más Grandes](../tutorial/bigger-applications.md) y [Testing](../tutorial/testing.md): +Para un ejemplo simple, consideremos una estructura de archivos similar a la descrita en [Aplicaciones Más Grandes](../tutorial/bigger-applications.md) y [Escribir pruebas](../tutorial/testing.md): ``` . @@ -71,7 +71,7 @@ Luego podemos crear un `AsyncClient` con la app y enviar requests asíncronos a Esto es equivalente a: ```Python -response = client.get('/') +response = client.get("/") ``` ...que usábamos para hacer nuestros requests con el `TestClient`. diff --git a/docs/es/docs/advanced/behind-a-proxy.md b/docs/es/docs/advanced/behind-a-proxy.md index a6cf0cca2e..c21df0fda0 100644 --- a/docs/es/docs/advanced/behind-a-proxy.md +++ b/docs/es/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ Estos proxies podrían manejar certificados HTTPS y otras cosas. Un **proxy** delante de tu aplicación normalmente establecería algunos headers sobre la marcha antes de enviar los requests a tu **server** para que el servidor sepa que el request fue **reenviado** por el proxy, informándole la URL original (pública), incluyendo el dominio, que está usando HTTPS, etc. -El programa **server** (por ejemplo **Uvicorn** a través de **FastAPI CLI**) es capaz de interpretar esos headers, y luego pasar esa información a tu aplicación. +El **server** iniciado por `fastapi run` es capaz de interpretar esos headers, y luego pasar esa información a tu aplicación. Pero por seguridad, como el server no sabe que está detrás de un proxy confiable, no interpretará esos headers. @@ -22,7 +22,7 @@ Los headers del proxy son: /// -### Habilitar headers reenviados por el Proxy { #enable-proxy-forwarded-headers } +### Habilita headers reenviados por el Proxy { #enable-proxy-forwarded-headers } Puedes iniciar FastAPI CLI con la *Opción de CLI* `--forwarded-allow-ips` y pasar las direcciones IP que deberían ser confiables para leer esos headers reenviados. @@ -34,8 +34,6 @@ Si tu **server** está detrás de un **proxy** confiable y solo el proxy le habl ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ Cuando **FastAPI CLI** está configurado con `--forwarded-allow-ips`, confía en Podrías tener un proxy que añada un prefijo de path a tu aplicación. -En estos casos, puedes usar `root_path` para configurar tu aplicación. +En estos casos, puedes configurar el servidor con `fastapi run --root-path`. El `root_path` es un mecanismo proporcionado por la especificación ASGI (en la que está construido FastAPI, a través de Starlette). @@ -117,11 +115,11 @@ Aunque todo tu código esté escrito asumiendo que solo existe `/app`. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -Y el proxy estaría **"eliminando"** el **prefijo del path** sobre la marcha antes de transmitir el request al servidor de aplicaciones (probablemente Uvicorn a través de FastAPI CLI), manteniendo a tu aplicación convencida de que está siendo servida en `/app`, así que no tienes que actualizar todo tu código para incluir el prefijo `/api/v1`. +Y el proxy estaría **"eliminando"** el **prefijo del path** sobre la marcha antes de transmitir el request al servidor, manteniendo a tu aplicación convencida de que está siendo servida en `/app`, así que no tienes que actualizar todo tu código para incluir el prefijo `/api/v1`. Hasta aquí, todo funcionaría normalmente. -Pero luego, cuando abres la UI integrada de los docs (el frontend), esperaría obtener el esquema de OpenAPI en `/openapi.json`, en lugar de `/api/v1/openapi.json`. +Pero luego, cuando abres la UI integrada de la documentación (el frontend), esperaría obtener el esquema de OpenAPI en `/openapi.json`, en lugar de `/api/v1/openapi.json`. Entonces, el frontend (que se ejecuta en el navegador) trataría de alcanzar `/openapi.json` y no podría obtener el esquema de OpenAPI. @@ -144,7 +142,7 @@ La IP `0.0.0.0` se usa comúnmente para indicar que el programa escucha en todas /// -La UI de los docs también necesitaría el esquema de OpenAPI para declarar que este API `servidor` se encuentra en `/api/v1` (detrás del proxy). Por ejemplo: +La UI de la documentación también necesitaría el esquema de OpenAPI para declarar que este `server` de la API se encuentra en `/api/v1` (detrás del proxy). Por ejemplo: ```JSON hl_lines="4-8" { @@ -161,7 +159,7 @@ La UI de los docs también necesitaría el esquema de OpenAPI para declarar que } ``` -En este ejemplo, el "Proxy" podría ser algo como **Traefik**. Y el servidor sería algo como FastAPI CLI con **Uvicorn**, ejecutando tu aplicación de FastAPI. +En este ejemplo, el "Proxy" podría ser algo como **Traefik**. Y `fastapi run` iniciaría el servidor que ejecuta tu aplicación de FastAPI. ### Proporcionando el `root_path` { #providing-the-root-path } @@ -171,14 +169,10 @@ Para lograr esto, puedes usar la opción de línea de comandos `--root-path` com ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -Si usas Hypercorn, también tiene la opción `--root-path`. - /// note | Detalles Técnicos La especificación ASGI define un `root_path` para este caso de uso. @@ -195,14 +189,12 @@ Aquí lo estamos incluyendo en el mensaje solo con fines de demostración. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -Luego, si inicias Uvicorn con: +Luego, si inicias el servidor con:
-Pero si accedemos a la UI de los docs en la URL "oficial" usando el proxy con puerto `9999`, en `/api/v1/docs`, ¡funciona correctamente! 🎉
+Pero si accedemos a la UI de la documentación en la URL "oficial" usando el proxy con puerto `9999`, en `/api/v1/docs`, ¡funciona correctamente! 🎉
-Puedes verificarlo en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs):
+Puedes revisarlo en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs):
@@ -394,11 +365,11 @@ Este es un caso de uso más avanzado. Siéntete libre de omitirlo.
Por defecto, **FastAPI** creará un `server` en el esquema de OpenAPI con la URL para el `root_path`.
-Pero también puedes proporcionar otros `servers` alternativos, por ejemplo, si deseas que *la misma* UI de los docs interactúe con un entorno de pruebas y de producción.
+Pero también puedes proporcionar otros `servers` alternativos, por ejemplo, si deseas que *la misma* UI de la documentación interactúe con un entorno de pruebas y de producción.
Si pasas una lista personalizada de `servers` y hay un `root_path` (porque tu API existe detrás de un proxy), **FastAPI** insertará un "server" con este `root_path` al comienzo de la lista.
-Por ejemplo:
+Por ejemplo, usando la misma configuración del servidor `fastapi run --root-path /api/v1`:
{* ../../docs_src/behind_a_proxy/tutorial003_py310.py hl[4:7] *}
@@ -433,13 +404,13 @@ Observa el server auto-generado con un valor `url` de `/api/v1`, tomado del `roo
///
-En la UI de los docs en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) se vería como:
+En la UI de la documentación en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) se vería como:
/// tip | Consejo
-La UI de los docs interactuará con el server que selecciones.
+La UI de la documentación interactuará con el server que selecciones.
///
@@ -451,16 +422,16 @@ Si no especificas el parámetro `servers` y `root_path` es igual a `/`, la propi
///
-### Desactivar el server automático de `root_path` { #disable-automatic-server-from-root-path }
+### Desactiva el server automático de `root_path` { #disable-automatic-server-from-root-path }
Si no quieres que **FastAPI** incluya un server automático usando el `root_path`, puedes usar el parámetro `root_path_in_servers=False`:
-{* ../../docs_src/behind_a_proxy/tutorial004_py310.py hl[9] *}
+{* ../../docs_src/behind_a_proxy/tutorial004_py310.py hl[8] *}
y entonces no lo incluirá en el esquema de OpenAPI.
## Montando una sub-aplicación { #mounting-a-sub-application }
-Si necesitas montar una sub-aplicación (como se describe en [Aplicaciones secundarias - Monturas](sub-applications.md)) mientras usas un proxy con `root_path`, puedes hacerlo normalmente, como esperarías.
+Si necesitas montar una sub-aplicación (como se describe en [Aplicaciones secundarias - Mounts](sub-applications.md)) mientras usas un proxy con `root_path`, puedes hacerlo normalmente, como esperarías.
FastAPI usará internamente el `root_path` de manera inteligente, así que simplemente funcionará. ✨
diff --git a/docs/es/docs/advanced/security/http-basic-auth.md b/docs/es/docs/advanced/security/http-basic-auth.md
index c9c1562b5a..20784d21f8 100644
--- a/docs/es/docs/advanced/security/http-basic-auth.md
+++ b/docs/es/docs/advanced/security/http-basic-auth.md
@@ -12,7 +12,7 @@ Eso le dice al navegador que muestre el prompt integrado para un nombre de usuar
Luego, cuando escribes ese nombre de usuario y contraseña, el navegador los envía automáticamente en el header.
-## Simple HTTP Basic Auth { #simple-http-basic-auth }
+## HTTP Basic Auth simple { #simple-http-basic-auth }
* Importa `HTTPBasic` y `HTTPBasicCredentials`.
* Crea un "esquema de `security`" usando `HTTPBasic`.
@@ -30,9 +30,9 @@ Cuando intentas abrir la URL por primera vez (o haces clic en el botón "Execute
Aquí hay un ejemplo más completo.
-Usa una dependencia para comprobar si el nombre de usuario y la contraseña son correctos.
+Usa una dependencia para revisar si el nombre de usuario y la contraseña son correctos.
-Para esto, usa el módulo estándar de Python [`secrets`](https://docs.python.org/3/library/secrets.html) para verificar el nombre de usuario y la contraseña.
+Para esto, usa el módulo estándar de Python [`secrets`](https://docs.python.org/3/library/secrets.html) para revisar el nombre de usuario y la contraseña.
`secrets.compare_digest()` necesita tomar `bytes` o un `str` que solo contenga caracteres ASCII (los carácteres en inglés), esto significa que no funcionaría con caracteres como `á`, como en `Sebastián`.
@@ -45,7 +45,9 @@ Luego podemos usar `secrets.compare_digest()` para asegurar que `credentials.use
Esto sería similar a:
```Python
-if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"):
+if not (credentials.username == "stanleyjobson") or not (
+ credentials.password == "swordfish"
+):
# Devuelve algún error
...
```
diff --git a/docs/es/docs/advanced/templates.md b/docs/es/docs/advanced/templates.md
index 5bf75be269..4dacd9351b 100644
--- a/docs/es/docs/advanced/templates.md
+++ b/docs/es/docs/advanced/templates.md
@@ -1,3 +1,7 @@
+---
+render_macros: false
+---
+
# Plantillas { #templates }
Puedes usar cualquier motor de plantillas que desees con **FastAPI**.
@@ -63,14 +67,10 @@ Luego puedes escribir una plantilla en `templates/item.html` con, por ejemplo:
En el HTML que contiene:
-{% raw %}
-
```jinja
Item ID: {{ id }}
```
-{% endraw %}
-
...mostrará el `id` tomado del `dict` de "contexto" que pasaste:
```Python
@@ -89,22 +89,48 @@ También puedes usar `url_for()` dentro de la plantilla, toma como argumentos lo
Entonces, la sección con:
-{% raw %}
-
```jinja
```
-{% endraw %}
-
...generará un enlace hacia la misma URL que manejaría la *path operation function* `read_item(id=id)`.
-Por ejemplo, con un ID de `42`, esto se renderizaría como:
+`url_for()` devuelve una URL absoluta, incluidos el esquema y el host, basada en el request actual.
+
+Por ejemplo, si tu aplicación se sirve en `https://example.com`, con un ID de `42`, esto se renderizaría como:
+
+```html
+
+```
+
+### Paths de URL en plantillas { #url-paths-in-templates }
+
+Para enlaces al mismo sitio, puedes usar el atributo `.path` para obtener solo el path de la URL, por ejemplo, en `templates/item_path.html`:
+
+```jinja hl_lines="4 7"
+{!../../docs_src/templates/templates/item_path.html!}
+```
+
+Pasa el nombre de la plantilla a `TemplateResponse`:
+
+{* ../../docs_src/templates/tutorial002_py310.py ln[14:18] hl[17] *}
+
+Con el mismo ejemplo, el enlace al ítem se renderizaría como:
```html
```
+La `/` inicial hace que este path sea relativo a la raíz del sitio actual.
+
+El atributo `.path` excluye el esquema, el host, los parámetros de query y el fragmento. Usa la URL completa para enlaces a otro host.
+
+/// tip | Consejo
+
+Si tu aplicación está detrás de un proxy, configura los headers reenviados y `root_path` como se describe en [Detrás de un proxy](behind-a-proxy.md).
+
+///
+
## Plantillas y archivos estáticos { #templates-and-static-files }
También puedes usar `url_for()` dentro de la plantilla, y usarlo, por ejemplo, con los `StaticFiles` que montaste con el `name="static"`.
diff --git a/docs/es/docs/async.md b/docs/es/docs/async.md
index be64f4cbea..e9665523ff 100644
--- a/docs/es/docs/async.md
+++ b/docs/es/docs/async.md
@@ -15,7 +15,7 @@ results = await some_library()
Entonces, declara tus *path operation functions* con `async def` así:
```Python hl_lines="2"
-@app.get('/')
+@app.get("/")
async def read_results():
results = await some_library()
return results
@@ -32,7 +32,7 @@ Solo puedes usar `await` dentro de funciones creadas con `async def`.
Si estás usando un paquete de terceros que se comunica con algo (una base de datos, una API, el sistema de archivos, etc.) y no tiene soporte para usar `await` (este es actualmente el caso para la mayoría de los paquetes de base de datos), entonces declara tus *path operation functions* como normalmente, usando simplemente `def`, así:
```Python hl_lines="2"
-@app.get('/')
+@app.get("/")
def results():
results = some_library()
return results
@@ -302,7 +302,7 @@ Para ver cómo lograr este paralelismo en producción, consulta la sección sobr
## `async` y `await` { #async-and-await }
-Las versiones modernas de Python tienen una forma muy intuitiva de definir código asíncrono. Esto hace que se vea igual que el código "secuencial" normal y hace el "wait" por ti en los momentos adecuados.
+Las versiones modernas de Python tienen una forma muy intuitiva de definir código asíncrono. Esto hace que se vea igual que el código "secuencial" normal y hace la "espera" por ti en los momentos adecuados.
Cuando hay una operación que requerirá esperar antes de dar los resultados y tiene soporte para estas nuevas funcionalidades de Python, puedes programarlo así:
@@ -316,7 +316,7 @@ Para que `await` funcione, tiene que estar dentro de una función que soporte es
```Python hl_lines="1"
async def get_burgers(number: int):
- # Hacer algunas cosas asíncronas para crear las hamburguesas
+ # Haz algunas cosas asíncronas para crear las hamburguesas
return burgers
```
@@ -325,7 +325,7 @@ async def get_burgers(number: int):
```Python hl_lines="2"
# Esto no es asíncrono
def get_sequential_burgers(number: int):
- # Hacer algunas cosas secuenciales para crear las hamburguesas
+ # Haz algunas cosas secuenciales para crear las hamburguesas
return burgers
```
@@ -343,7 +343,7 @@ burgers = get_burgers(2)
Así que, si estás usando un paquete que te dice que puedes llamarlo con `await`, necesitas crear las *path operation functions* que lo usen con `async def`, como en:
```Python hl_lines="2-3"
-@app.get('/burgers')
+@app.get("/burgers")
async def read_burgers():
burgers = await get_burgers(2)
return burgers
@@ -435,7 +435,7 @@ Cualquier otra función de utilidad que llames directamente puede ser creada con
Esto contrasta con las funciones que FastAPI llama por ti: *path operation functions* y dependencias.
-Si tu función de utilidad es una función normal con `def`, será llamada directamente (como la escribas en tu código), no en un threadpool; si la función es creada con `async def` entonces deberías "await" por esa función cuando la llames en tu código.
+Si tu función de utilidad es una función normal con `def`, será llamada directamente (como la escribas en tu código), no en un threadpool; si la función es creada con `async def` entonces deberías usar `await` con esa función cuando la llames en tu código.
---
diff --git a/docs/es/docs/features.md b/docs/es/docs/features.md
index 5112ead631..859205c39b 100644
--- a/docs/es/docs/features.md
+++ b/docs/es/docs/features.md
@@ -8,8 +8,8 @@
* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para la creación de APIs, incluyendo declaraciones de path operations, parámetros, request bodies, seguridad, etc.
* Documentación automática de modelos de datos con [**JSON Schema**](https://json-schema.org/) (ya que OpenAPI en sí mismo está basado en JSON Schema).
-* Diseñado alrededor de estos estándares, tras un estudio meticuloso. En lugar de ser una capa adicional.
-* Esto también permite el uso de **generación de código cliente automática** en muchos idiomas.
+* Diseñado alrededor de estos estándares, tras un estudio meticuloso. En lugar de ser una capa adicional añadida a posteriori.
+* Esto también permite el uso de **generación de código cliente automática** en muchos lenguajes.
### Documentación automática { #automatic-docs }
@@ -36,8 +36,9 @@ from datetime import date
from pydantic import BaseModel
+
# Declara una variable como un str
-# y obtiene soporte del editor dentro de la función
+# y obtén soporte del editor dentro de la función
def main(user_id: str):
return user_id
@@ -77,7 +78,7 @@ Todo el framework fue diseñado para ser fácil e intuitivo de usar, todas las d
En las encuestas a desarrolladores de Python, es claro [que una de las funcionalidades más usadas es el "autocompletado"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features).
-Todo el framework **FastAPI** está basado para satisfacer eso. El autocompletado funciona en todas partes.
+Todo el framework **FastAPI** está diseñado para satisfacer eso. El autocompletado funciona en todas partes.
Rara vez necesitarás regresar a la documentación.
@@ -190,11 +191,11 @@ Con **FastAPI** obtienes todas las funcionalidades de **Pydantic** (ya que FastA
* **Sin complicaciones**:
* Sin micro-lenguaje de definición de esquemas nuevo que aprender.
* Si conoces los tipos en Python sabes cómo usar Pydantic.
-* Se lleva bien con tu **IDE/linter/cerebro**:
+* Se lleva bien con tu **IDE/linter/cerebro**:
* Porque las estructuras de datos de pydantic son solo instances de clases que defines; autocompletado, linting, mypy y tu intuición deberían funcionar correctamente con tus datos validados.
* Valida **estructuras complejas**:
* Uso de modelos jerárquicos de Pydantic, `List` y `Dict` de `typing` de Python, etc.
- * Y los validadores permiten definir, verificar y documentar de manera clara y fácil esquemas de datos complejos como JSON Schema.
+ * Y los validadores permiten definir, revisar y documentar de manera clara y fácil esquemas de datos complejos como JSON Schema.
* Puedes tener objetos JSON profundamente **anidados** y validarlos todos y anotarlos.
* **Extensible**:
* Pydantic permite definir tipos de datos personalizados o puedes extender la validación con métodos en un modelo decorados con el decorador validator.
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index d1a7044896..f5aea54327 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -17,16 +17,16 @@ include_yaml:
@@ -133,7 +133,7 @@ Las funcionalidades clave son:
"_Adoptamos el paquete **FastAPI** para crear un servidor **REST** que pueda ser consultado para obtener **predicciones**. [para Ludwig]_"
-
+
## **Typer**, el FastAPI de las CLIs { #typer-the-fastapi-of-clis }
@@ -360,11 +360,11 @@ Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
* Haz clic en el botón "Try it out", te permite llenar los parámetros e interactuar directamente con la API:
-
+
* Luego haz clic en el botón "Execute", la interfaz de usuario se comunicará con tu API, enviará los parámetros, obtendrá los resultados y los mostrará en la pantalla:
-
+
### Actualización de la documentación alternativa de la API { #alternative-api-docs-upgrade }
@@ -467,7 +467,7 @@ Intenta cambiar la línea con:
...y observa cómo tu editor autocompleta los atributos y conoce sus tipos:
-
+
Para un ejemplo más completo incluyendo más funcionalidades, ve al Tutorial - Guía del Usuario.
@@ -544,9 +544,9 @@ Usadas por Pydantic:
Usadas por Starlette:
-* [`httpx`](https://www.python-httpx.org) - Requerido si deseas usar el `TestClient`.
+* [`httpx2`](https://pydantic.dev/docs/httpx2/) (o `httpx`) - Usado por el `TestClient`.
* [`jinja2`](https://jinja.palletsprojects.com) - Requerido si deseas usar la configuración de plantilla por defecto.
-* [`python-multipart`](https://github.com/Kludex/python-multipart) - Requerido si deseas soportar form "parsing", con `request.form()`.
+* [`python-multipart`](https://github.com/Kludex/python-multipart) - Requerido si deseas soportar el "parsing" de formularios, con `request.form()`.
Usadas por FastAPI:
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index 8da56dcb83..ade74a9d37 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -142,7 +142,7 @@ Pero queremos ser más inteligentes y simplificar un poco el código.
Sabemos que todas las *path operations* en este módulo tienen el mismo:
-* Prefijo de path: `/items`.
+* `prefix` de path: `/items`.
* `tags`: (solo una etiqueta: `items`).
* `responses` extra.
* `dependencies`: todas necesitan esa dependencia `X-Token` que creamos.
@@ -155,8 +155,7 @@ Como el path de cada *path operation* tiene que empezar con `/`, como en:
```Python hl_lines="1"
@router.get("/{item_id}")
-async def read_item(item_id: str):
- ...
+async def read_item(item_id: str): ...
```
...el prefijo no debe incluir un `/` final.
diff --git a/docs/es/docs/tutorial/body-fields.md b/docs/es/docs/tutorial/body-fields.md
index 8902ce4e94..a26a412e1c 100644
--- a/docs/es/docs/tutorial/body-fields.md
+++ b/docs/es/docs/tutorial/body-fields.md
@@ -2,19 +2,20 @@
De la misma manera que puedes declarar validaciones adicionales y metadatos en los parámetros de las *path operation function* con `Query`, `Path` y `Body`, puedes declarar validaciones y metadatos dentro de los modelos de Pydantic usando `Field` de Pydantic.
-## Importar `Field` { #import-field }
+## Importa `Field` { #import-field }
Primero, tienes que importarlo:
{* ../../docs_src/body_fields/tutorial001_an_py310.py hl[4] *}
+
/// warning | Advertencia
Fíjate que `Field` se importa directamente desde `pydantic`, no desde `fastapi` como el resto (`Query`, `Path`, `Body`, etc).
///
-## Declarar atributos del modelo { #declare-model-attributes }
+## Declara atributos del modelo { #declare-model-attributes }
Después puedes utilizar `Field` con los atributos del modelo:
@@ -40,15 +41,15 @@ Observa cómo cada atributo del modelo con un tipo, un valor por defecto y `Fiel
///
-## Agregar información extra { #add-extra-information }
+## Agrega información extra { #add-extra-information }
-Puedes declarar información extra en `Field`, `Query`, `Body`, etc. Y será incluida en el JSON Schema generado.
+Puedes declarar información extra con `json_schema_extra` en `Field`, `Query`, `Body`, etc. Y será incluida en el JSON Schema generado.
Aprenderás más sobre cómo agregar información extra más adelante en la documentación, cuando aprendamos a declarar ejemplos.
/// warning | Advertencia
-Las claves extra pasadas a `Field` también estarán presentes en el esquema de OpenAPI resultante para tu aplicación.
+Las claves extra pasadas en `json_schema_extra` también estarán presentes en el esquema de OpenAPI resultante para tu aplicación.
Como estas claves no necesariamente tienen que ser parte de la especificación de OpenAPI, algunas herramientas de OpenAPI, por ejemplo [el validador de OpenAPI](https://validator.swagger.io/), podrían no funcionar con tu esquema generado.
///
@@ -57,4 +58,4 @@ Como estas claves no necesariamente tienen que ser parte de la especificación d
Puedes utilizar `Field` de Pydantic para declarar validaciones adicionales y metadatos para los atributos del modelo.
-También puedes usar los argumentos de palabra clave extra para pasar metadatos adicionales del JSON Schema.
+También puedes usar `json_schema_extra` para pasar metadatos adicionales del JSON Schema.
diff --git a/docs/es/docs/tutorial/cookie-param-models.md b/docs/es/docs/tutorial/cookie-param-models.md
index 3fbf0bcb5e..4ae0e57b9b 100644
--- a/docs/es/docs/tutorial/cookie-param-models.md
+++ b/docs/es/docs/tutorial/cookie-param-models.md
@@ -1,4 +1,4 @@
-# Modelos de Cookies { #cookie-parameter-models }
+# Modelos de Parámetros de Cookie { #cookie-parameter-models }
Si tienes un grupo de **cookies** que están relacionadas, puedes crear un **modelo de Pydantic** para declararlas. 🍪
@@ -42,17 +42,17 @@ Pero incluso si **rellenas los datos** y haces clic en "Execute", como la UI de
///
-## Prohibir Cookies Extra { #forbid-extra-cookies }
+## Prohíbe Cookies Extra { #forbid-extra-cookies }
En algunos casos de uso especiales (probablemente no muy comunes), podrías querer **restringir** las cookies que deseas recibir.
Tu API ahora tiene el poder de controlar su propio consentimiento de cookies. 🤪🍪
-Puedes usar la configuración del modelo de Pydantic para `prohibir` cualquier campo `extra`:
+Puedes usar la configuración del modelo de Pydantic para `forbid` cualquier campo `extra`:
{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *}
-Si un cliente intenta enviar algunas **cookies extra**, recibirán un response de **error**.
+Si un cliente intenta enviar algunas **cookies extra**, recibirá un response de **error**.
Pobres banners de cookies con todo su esfuerzo para obtener tu consentimiento para que la API lo rechace. 🍪
@@ -71,6 +71,22 @@ Por ejemplo, si el cliente intenta enviar una cookie `santa_tracker` con un valo
}
```
+## Combina Modelos de Parámetros { #combine-parameter-models }
+
+Puedes combinar múltiples modelos de parámetros de cookie con parámetros de cookie individuales y dependencias. Cada modelo se extrae y se valida de forma independiente, como se explica para los [modelos de parámetros de query](query-param-models.md#combine-parameter-models).
+
+La configuración `extra` de cada modelo se aplica a todos los parámetros de cookie, incluidos los declarados en otros modelos o dependencias. Con `extra="forbid"`, se rechaza cualquier cookie que no forme parte de ese modelo. Con `extra="allow"`, esas cookies se incluyen como campos extra del modelo.
+
+## Modelos Opcionales de Parámetros de Cookie { #optional-cookie-parameter-models }
+
+Declara un modelo de parámetros de cookie con `| None` y un valor por defecto de `None` para hacer que el grupo sea opcional.
+
+{* ../../docs_src/cookie_param_models/tutorial003_an_py310.py hl[15] *}
+
+Si no se envía ni `theme` ni `locale`, `preferences` es `None`. Si se envía cualquiera de los dos, FastAPI valida el modelo y requiere ambos campos.
+
+Se aplican las mismas reglas para los valores por defecto, los campos extra y OpenAPI que para los [modelos opcionales de parámetros de query](query-param-models.md#optional-query-parameter-models).
+
## Resumen { #summary }
Puedes usar **modelos de Pydantic** para declarar **cookies** en **FastAPI**. 😎
diff --git a/docs/es/docs/tutorial/dependencies/sub-dependencies.md b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
index 2432707f7d..4943363b0b 100644
--- a/docs/es/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
@@ -64,8 +64,10 @@ En un escenario avanzado donde sabes que necesitas que la dependencia se llame e
//// tab | Python 3.10+
-```Python hl_lines="1"
-async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]):
+```Python hl_lines="2"
+async def needy_dependency(
+ fresh_value: Annotated[str, Depends(get_value, use_cache=False)],
+):
return {"fresh_value": fresh_value}
```
diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md
index 55a8d32b60..3105f78911 100644
--- a/docs/es/docs/tutorial/extra-models.md
+++ b/docs/es/docs/tutorial/extra-models.md
@@ -54,10 +54,10 @@ obtendríamos un `dict` de Python con:
```Python
{
- 'username': 'john',
- 'password': 'secret',
- 'email': 'john.doe@example.com',
- 'full_name': None,
+ "username": "john",
+ "password": "secret",
+ "email": "john.doe@example.com",
+ "full_name": None,
}
```
@@ -86,10 +86,10 @@ O más exactamente, usando `user_dict` directamente, con cualquier contenido que
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
)
```
@@ -124,11 +124,11 @@ UserInDB(**user_in.model_dump(), hashed_password=hashed_password)
```Python
UserInDB(
- username = user_dict["username"],
- password = user_dict["password"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- hashed_password = hashed_password,
+ username=user_dict["username"],
+ password=user_dict["password"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ hashed_password=hashed_password,
)
```
@@ -138,7 +138,7 @@ Las funciones adicionales de soporte `fake_password_hasher` y `fake_save_user` s
///
-## Reducir duplicación { #reduce-duplication }
+## Reduce la duplicación { #reduce-duplication }
Reducir la duplicación de código es una de las ideas centrales en **FastAPI**.
@@ -186,9 +186,9 @@ some_variable: PlaneItem | CarItem
Pero si ponemos eso en la asignación `response_model=PlaneItem | CarItem` obtendríamos un error, porque Python intentaría realizar una **operación inválida** entre `PlaneItem` y `CarItem` en lugar de interpretar eso como una anotación de tipos.
-## Lista de modelos { #list-of-models }
+## List de modelos { #list-of-models }
-De la misma manera, puedes declarar responses de listas de objetos.
+De la misma manera, puedes declarar responses de lists de objetos.
Para eso, usa la `list` estándar de Python:
diff --git a/docs/es/docs/tutorial/header-param-models.md b/docs/es/docs/tutorial/header-param-models.md
index 546a8946d7..dea62648c2 100644
--- a/docs/es/docs/tutorial/header-param-models.md
+++ b/docs/es/docs/tutorial/header-param-models.md
@@ -26,11 +26,11 @@ Puedes ver los headers requeridos en la interfaz de documentación en `/docs`:
-## Prohibir Headers Extra { #forbid-extra-headers }
+## Prohíbe Headers Extra { #forbid-extra-headers }
En algunos casos de uso especiales (probablemente no muy comunes), podrías querer **restringir** los headers que deseas recibir.
-Puedes usar la configuración del modelo de Pydantic para `prohibir` cualquier campo `extra`:
+Puedes usar la configuración del modelo de Pydantic para prohibir (`forbid`) cualquier campo `extra`:
{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
@@ -51,7 +51,7 @@ Por ejemplo, si el cliente intenta enviar un header `tool` con un valor de `plum
}
```
-## Desactivar la conversión de guiones bajos { #disable-convert-underscores }
+## Desactiva la conversión de guiones bajos { #disable-convert-underscores }
De la misma forma que con los parámetros de header normales, cuando tienes caracteres de guion bajo en los nombres de los parámetros, se **convierten automáticamente en guiones**.
@@ -67,6 +67,26 @@ Antes de establecer `convert_underscores` a `False`, ten en cuenta que algunos p
///
+## Combina Modelos de Parámetros { #combine-parameter-models }
+
+Puedes combinar múltiples modelos de parámetros de header con parámetros de header individuales y dependencias. Cada modelo se extrae y se valida de forma independiente, como se explica para los [modelos de parámetros de query](query-param-models.md#combine-parameter-models).
+
+La configuración `extra` de cada modelo se aplica a todos los parámetros de header, incluidos los declarados en otros modelos o dependencias. Con `extra="forbid"`, se rechaza cualquier header que no forme parte de ese modelo. Con `extra="allow"`, esos headers se incluyen como campos extra del modelo.
+
+Cada modelo usa su propia configuración `Header(convert_underscores=...)`, tanto al leer el request como al generar OpenAPI. Los alias explícitos de los campos se mantienen como nombres literales de headers.
+
+## Modelos Opcionales de Parámetros de Header { #optional-header-parameter-models }
+
+Declara un modelo de parámetros de header con `| None` y un valor por defecto de `None` para que el grupo sea opcional.
+
+{* ../../docs_src/header_param_models/tutorial004_an_py310.py hl[15] *}
+
+Si no se envía ni `x-client-name` ni `x-client-version`, `client` es `None`. Si se envía cualquiera de los dos, FastAPI valida el modelo y requiere ambos campos.
+
+Se aplican las mismas reglas para los valores por defecto, los campos extra y OpenAPI que para los [modelos opcionales de parámetros de query](query-param-models.md#optional-query-parameter-models).
+
+Los headers como `Host` también siguen la configuración `extra` del modelo. Con `extra="allow"`, hacen que el modelo esté presente incluso si no se proporciona ninguno de los campos declarados.
+
## Resumen { #summary }
Puedes usar **modelos Pydantic** para declarar **headers** en **FastAPI**. 😎
diff --git a/docs/es/docs/tutorial/path-params-numeric-validations.md b/docs/es/docs/tutorial/path-params-numeric-validations.md
index 24cd5117e9..323d56e327 100644
--- a/docs/es/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/es/docs/tutorial/path-params-numeric-validations.md
@@ -2,7 +2,7 @@
De la misma manera que puedes declarar más validaciones y metadatos para los parámetros de query con `Query`, puedes declarar el mismo tipo de validaciones y metadatos para los parámetros de path con `Path`.
-## Importar `Path` { #import-path }
+## Importa `Path` { #import-path }
Primero, importa `Path` de `fastapi`, e importa `Annotated`:
@@ -18,7 +18,7 @@ Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgr
///
-## Declarar metadatos { #declare-metadata }
+## Declara metadatos { #declare-metadata }
Puedes declarar todos los mismos parámetros que para `Query`.
@@ -28,7 +28,7 @@ Por ejemplo, para declarar un valor de metadato `title` para el parámetro de pa
/// note | Nota
-Un parámetro de path siempre es requerido ya que tiene que formar parte del path. Incluso si lo declaras con `None` o le asignas un valor por defecto, no afectará en nada, siempre será requerido.
+Un parámetro de path siempre es requerido ya que tiene que formar parte del path de la URL. Añadir `None` a su tipo no lo hace opcional. Un parámetro declarado con `Path` no puede tener un valor por defecto.
///
@@ -81,7 +81,7 @@ Si quieres:
Pasa `*`, como el primer parámetro de la función.
-Python no hará nada con ese `*`, pero sabrá que todos los parámetros siguientes deben ser llamados como argumentos de palabras clave (parejas key-value), también conocidos como kwargs. Incluso si no tienen un valor por defecto.
+Python no hará nada con ese `*`, pero sabrá que todos los parámetros siguientes deben ser llamados como argumentos de palabras clave (parejas clave-valor), también conocidos como kwargs. Incluso si no tienen un valor por defecto.
{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
diff --git a/docs/es/docs/tutorial/query-param-models.md b/docs/es/docs/tutorial/query-param-models.md
index e335cfe61e..5aca2348cb 100644
--- a/docs/es/docs/tutorial/query-param-models.md
+++ b/docs/es/docs/tutorial/query-param-models.md
@@ -26,7 +26,7 @@ Puedes ver los parámetros query en la UI de documentación en `/docs`:
-## Prohibir Parámetros Query Extras { #forbid-extra-query-parameters }
+## Prohíbe Parámetros Query Extras { #forbid-extra-query-parameters }
En algunos casos de uso especiales (probablemente no muy comunes), podrías querer **restringir** los parámetros query que deseas recibir.
@@ -34,7 +34,7 @@ Puedes usar la configuración del modelo de Pydantic para `forbid` cualquier cam
{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *}
-Si un cliente intenta enviar algunos datos **extra** en los **parámetros query**, recibirán un response de **error**.
+Si un cliente intenta enviar algunos datos **extra** en los **parámetros query**, recibirá un response de **error**.
Por ejemplo, si el cliente intenta enviar un parámetro query `tool` con un valor de `plumbus`, como:
@@ -42,7 +42,7 @@ Por ejemplo, si el cliente intenta enviar un parámetro query `tool` con un valo
https://example.com/items/?limit=10&tool=plumbus
```
-Recibirán un response de **error** que les indica que el parámetro query `tool` no está permitido:
+Recibirá un response de **error** que le indica que el parámetro query `tool` no está permitido:
```json
{
@@ -57,6 +57,42 @@ Recibirán un response de **error** que les indica que el parámetro query `tool
}
```
+## Combina Modelos de Parámetros { #combine-parameter-models }
+
+Puedes declarar múltiples modelos de parámetros query y combinarlos con parámetros query individuales o dependencias.
+
+{* ../../docs_src/query_param_models/tutorial003_an_py310.py hl[9:15,20:22] *}
+
+Los parámetros del request permanecen en el mismo nivel.
+
+```http
+https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt
+```
+
+No hay claves `pagination` ni `filters` en el query string. Cada modelo valida los parámetros query de forma independiente, con sus propios valores por defecto, validadores de campos y validadores de modelo. Lo mismo se aplica cuando los modelos o los parámetros individuales se declaran en dependencias.
+
+Si los modelos comparten un nombre de parámetro o un alias, cada modelo valida ese parámetro del request de forma independiente. Usa nombres o alias distintos para valores independientes. OpenAPI muestra un parámetro compartido una sola vez, como hace con los parámetros compartidos con dependencias, por lo que las declaraciones compartidas deben describir el mismo tipo y las mismas restricciones.
+
+La configuración `extra` de cada modelo se aplica a todos los parámetros query, incluidos los declarados en otros modelos o dependencias. Con `extra="forbid"`, se rechaza cualquier parámetro ajeno a ese modelo. Con `extra="allow"`, esos parámetros se incluyen como extras del modelo.
+
+Esto también funciona para los modelos de `Header` y `Cookie`.
+
+## Modelos Opcionales de Parámetros Query { #optional-query-parameter-models }
+
+Declara un modelo de parámetros query con `| None` y un valor por defecto de `None` para hacer que el grupo sea opcional.
+
+{* ../../docs_src/query_param_models/tutorial004_an_py310.py hl[18] *}
+
+Si no se envía ni `start` ni `end`, `date_range` es `None`. Si se envía cualquiera de los dos, FastAPI valida el modelo y requiere ambos campos.
+
+Usar `| None` sin un valor por defecto sigue haciendo que el parámetro sea obligatorio.
+
+Los parámetros extra siguen la configuración `extra` del modelo. Los extras ignorados no hacen que el modelo se considere presente.
+
+OpenAPI muestra los campos del grupo individualmente y los marca como opcionales.
+
+También puedes declarar [modelos de parámetros header](header-param-models.md#optional-header-parameter-models) y [modelos de parámetros cookie](cookie-param-models.md#optional-cookie-parameter-models) opcionales.
+
## Resumen { #summary }
Puedes usar **modelos de Pydantic** para declarar **parámetros query** en **FastAPI**. 😎
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index cc227a7216..ac2ba74cea 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -20,7 +20,7 @@ Tener `str | None` permitirá que tu editor te dé un mejor soporte y detecte er
Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, **su longitud no exceda los 50 caracteres**.
-### Importar `Query` y `Annotated` { #import-query-and-annotated }
+### Importa `Query` y `Annotated` { #import-query-and-annotated }
Para lograr eso, primero importa:
@@ -35,11 +35,11 @@ FastAPI añadió soporte para `Annotated` (y empezó a recomendarlo) en la versi
Si tienes una versión más antigua, obtendrás errores al intentar usar `Annotated`.
-Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) a al menos 0.95.1 antes de usar `Annotated`.
+Asegúrate de [actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) a al menos 0.95.1 antes de usar `Annotated`.
///
-## Usar `Annotated` en el tipo del parámetro `q` { #use-annotated-in-the-type-for-the-q-parameter }
+## Usa `Annotated` en el tipo del parámetro `q` { #use-annotated-in-the-type-for-the-q-parameter }
¿Recuerdas que te dije antes que `Annotated` puede usarse para agregar metadatos a tus parámetros en la [Introducción a Tipos de Python](../python-types.md#type-hints-with-metadata-annotations)?
@@ -61,7 +61,7 @@ Ambas versiones significan lo mismo, `q` es un parámetro que puede ser un `str`
Ahora vamos a lo divertido. 🎉
-## Agregar `Query` a `Annotated` en el parámetro `q` { #add-query-to-annotated-in-the-q-parameter }
+## Agrega `Query` a `Annotated` en el parámetro `q` { #add-query-to-annotated-in-the-q-parameter }
Ahora que tenemos este `Annotated` donde podemos poner más información (en este caso algunas validaciones adicionales), agrega `Query` dentro de `Annotated`, y establece el parámetro `max_length` a `50`:
@@ -160,15 +160,15 @@ Cuando no usas `Annotated` y en su lugar usas el **estilo de valor por defecto (
Dado que `Annotated` puede tener más de una anotación de metadato, ahora podrías incluso usar la misma función con otras herramientas, como [Typer](https://typer.tiangolo.com/). 🚀
-## Agregar más validaciones { #add-more-validations }
+## Agrega más validaciones { #add-more-validations }
También puedes agregar un parámetro `min_length`:
{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *}
-## Agregar expresiones regulares { #add-regular-expressions }
+## Agrega expresiones regulares { #add-regular-expressions }
-Puedes definir una expresión regular `pattern` que el parámetro debe coincidir:
+Puedes definir una expresión regular `pattern` con la que el parámetro debe coincidir:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@@ -220,14 +220,22 @@ Así que, cuando necesites declarar un valor como requerido mientras usas `Query
{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
-### Requerido, puede ser `None` { #required-can-be-none }
+### Parámetros requeridos y `None` { #required-parameters-and-none }
-Puedes declarar que un parámetro puede aceptar `None`, pero que aún así es requerido. Esto obligaría a los clientes a enviar un valor, incluso si el valor es `None`.
-
-Para hacer eso, puedes declarar que `None` es un tipo válido pero simplemente no declarar un valor por defecto:
+El tipo `str | None` permite `None` como valor de Python, pero no hace que un parámetro de query sea opcional. Sin un valor por defecto, el parámetro sigue siendo requerido:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+Los valores de los parámetros de query llegan como strings y no tienen una representación integrada de `None`. Enviar `?q=None` o `?q=null` envía los strings `"None"` y `"null"`, respectivamente. Enviar `?q=` envía un string vacío, que no pasa la validación `min_length=3` en este ejemplo.
+
+Para permitir que los clientes omitan `q` y usen `None` como su valor, dale un valor por defecto de `None`:
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+Los request bodies JSON, a diferencia de los parámetros de query, pueden contener un valor `null` explícito.
+
## Lista de parámetros de Query / múltiples valores { #query-parameter-list-multiple-values }
Cuando defines un parámetro de query explícitamente con `Query` también puedes declararlo para recibir una lista de valores, o dicho de otra manera, para recibir múltiples valores.
@@ -302,7 +310,7 @@ Por ejemplo, `list[int]` revisaría (y documentaría) que el contenido de la lis
///
-## Declarar más metadatos { #declare-more-metadata }
+## Declara más metadatos { #declare-more-metadata }
Puedes agregar más información sobre el parámetro.
@@ -324,7 +332,7 @@ Y una `description`:
{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *}
-## Alias para parámetros { #alias-parameters }
+## Asigna alias a los parámetros { #alias-parameters }
Imagina que quieres que el parámetro sea `item-query`.
@@ -358,7 +366,7 @@ La documentación lo mostrará así:
-## Excluir parámetros de OpenAPI { #exclude-parameters-from-openapi }
+## Excluye parámetros de OpenAPI { #exclude-parameters-from-openapi }
Para excluir un parámetro de query del esquema de OpenAPI generado (y por lo tanto, de los sistemas de documentación automática), establece el parámetro `include_in_schema` de `Query` a `False`:
diff --git a/docs/es/docs/tutorial/query-params.md b/docs/es/docs/tutorial/query-params.md
index 484941b057..9065f1ffe6 100644
--- a/docs/es/docs/tutorial/query-params.md
+++ b/docs/es/docs/tutorial/query-params.md
@@ -107,7 +107,13 @@ o
http://127.0.0.1:8000/items/foo?short=yes
```
-o cualquier otra variación (mayúsculas, primera letra en mayúscula, etc.), tu función verá el parámetro `short` con un valor `bool` de `True`. De lo contrario, será `False`.
+o cualquier otra variación (mayúsculas, primera letra en mayúscula, etc.), tu función verá el parámetro `short` con un valor `bool` de `True`.
+
+Valores como `0`, `false`, `off` y `no` (incluidas las variaciones de mayúsculas y minúsculas) se convierten a `False`.
+
+Si se omite `short`, **FastAPI** usa su valor por defecto, que es `False` en este ejemplo.
+
+Un valor vacío (`?short=`) o un valor no reconocido (por ejemplo, `?short=maybe`) produce un error de validación `422`.
## Múltiples parámetros de path y de query { #multiple-path-and-query-parameters }
diff --git a/docs/es/docs/tutorial/request-form-models.md b/docs/es/docs/tutorial/request-form-models.md
index 7504284991..388902363b 100644
--- a/docs/es/docs/tutorial/request-form-models.md
+++ b/docs/es/docs/tutorial/request-form-models.md
@@ -28,6 +28,8 @@ Solo necesitas declarar un **modelo de Pydantic** con los campos que quieres rec
**FastAPI** **extraerá** los datos de **cada campo** de los **form data** en el request y te dará el modelo de Pydantic que definiste.
+Para las [casillas de verificación HTML](request-forms.md#boolean-form-fields), declara campos booleanos con un valor por defecto de `False`.
+
## Revisa la Documentación { #check-the-docs }
Puedes verificarlo en la interfaz de documentación en `/docs`:
@@ -36,7 +38,7 @@ Puedes verificarlo en la interfaz de documentación en `/docs`:
-## Prohibir Campos de Formulario Extra { #forbid-extra-form-fields }
+## Prohíbe Campos de Formulario Extra { #forbid-extra-form-fields }
En algunos casos de uso especiales (probablemente no muy comunes), podrías querer **restringir** los campos de formulario a solo aquellos declarados en el modelo de Pydantic. Y **prohibir** cualquier campo **extra**.
@@ -73,6 +75,58 @@ Recibirá un response de error indicando que el campo `extra` no está permitido
}
```
+## Combina Modelos de Formulario { #combine-form-models }
+
+Puedes combinar varios modelos de formulario con parámetros `Form` individuales.
+
+{* ../../docs_src/request_form_models/tutorial003_an_py310.py hl[9:14,19:21] *}
+
+El cliente envía `name`, `tags` y `token` como campos de formulario. Cada modelo valida los campos de formulario de forma independiente.
+
+La configuración `extra` de cada modelo se aplica a todos los campos de formulario, incluidos los campos y archivos declarados en otros parámetros o dependencias. Con `extra="forbid"`, se rechaza cualquier campo que no forme parte de ese modelo. Con `extra="allow"`, esos campos se incluyen como campos extra del modelo.
+
+Si varias declaraciones usan el mismo nombre de campo de formulario, cada una valida el valor de ese campo. Usa tipos y restricciones compatibles para los campos compartidos, de modo que el esquema OpenAPI pueda describirlos de forma coherente.
+
+## Modelos de Formulario Opcionales { #optional-form-models }
+
+Declara un modelo de formulario con `| None` y un valor por defecto de `None` para hacer que el grupo sea opcional.
+
+{* ../../docs_src/request_form_models/tutorial005_an_py310.py hl[17] *}
+
+Si no se envía ni `name` ni `age`, `profile` es `None`. Si se envía cualquiera de los dos, FastAPI valida el modelo y requiere ambos campos. Enviar un valor vacío también cuenta como proporcionar un campo.
+
+Usar `| None` sin un valor por defecto sigue haciendo que el parámetro sea obligatorio.
+
+Los campos extra siguen la configuración `extra` del modelo. Los campos extra ignorados no hacen que el modelo se considere presente.
+
+Un modelo opcional que solo contiene casillas de verificación sin marcar se omite. Envía un valor como `enabled=false` para proporcionarlo explícitamente.
+
+## Uniones Opcionales de Modelos de Formulario { #optional-unions-of-form-models }
+
+También puedes usar una unión opcional de modelos.
+
+{* ../../docs_src/request_form_models/tutorial006_an_py310.py hl[9:16,21] *}
+
+Si no se envían campos de formulario, `contact` es `None`. Envía `kind=person` con `name`, o `kind=company` con `company_name`. El discriminador selecciona qué modelo validar.
+
+## Combina Uniones de Modelos de Formulario { #combine-unions-of-form-models }
+
+Puedes combinar uniones con otros modelos de formulario, parámetros `Form` individuales y parámetros `File`. Cada unión se valida de forma independiente.
+
+{* ../../docs_src/request_form_models/tutorial007_an_py310.py hl[31:35] *}
+
+Envía todos los campos en el mismo formulario. Por ejemplo, envía `contact_type=person`, `name=Rick`, `notification_type=email`, `email=rick@example.com` y `token=secret`.
+
+Omite los campos de notificación para dejar `notification` como `None`.
+
+## Modelos de Formulario y Archivos { #form-models-and-files }
+
+También puedes combinar un modelo de formulario con [parámetros de archivo](request-files.md).
+
+{* ../../docs_src/request_form_models/tutorial004_an_py310.py hl[14] *}
+
+Aquí el cliente envía el campo `name` y el archivo `avatar` usando `multipart/form-data`.
+
## Resumen { #summary }
Puedes usar modelos de Pydantic para declarar campos de formulario en FastAPI. 😎
diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md
index 72f40c691a..edc4a36e9c 100644
--- a/docs/es/docs/tutorial/request-forms.md
+++ b/docs/es/docs/tutorial/request-forms.md
@@ -44,6 +44,14 @@ Para declarar bodies de formularios, necesitas usar `Form` explícitamente, porq
///
+## Campos de formulario booleanos { #boolean-form-fields }
+
+Los navegadores omiten las casillas de verificación no marcadas al enviar formularios HTML. Declara un parámetro de formulario booleano con un valor por defecto de `False` para recibir `False` cuando la casilla no esté marcada:
+
+{* ../../docs_src/request_forms/tutorial002_an_py310.py hl[9] *}
+
+Una casilla de verificación marcada envía su valor, que por defecto es `"on"`. **FastAPI** acepta `"on"` como `True`.
+
## Sobre "Campos de formulario" { #about-form-fields }
La manera en que los formularios HTML (``) envían los datos al servidor normalmente usa una codificación "especial" para esos datos, es diferente de JSON.
@@ -56,7 +64,9 @@ Los datos de formularios normalmente se codifican usando el "media type" `applic
Pero cuando el formulario incluye archivos, se codifica como `multipart/form-data`. Leerás sobre la gestión de archivos en el próximo capítulo.
-Si quieres leer más sobre estas codificaciones y campos de formulario, dirígete a las [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Puedes usar `Form(media_type="multipart/form-data")` para describir un formulario multipart en OpenAPI. Basta con configurarlo en un parámetro al combinar parámetros de formulario o modelos.
+
+Si quieres leer más sobre estas codificaciones y campos de formulario, dirígete a la [documentación web de MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/es/docs/tutorial/response-model.md b/docs/es/docs/tutorial/response-model.md
index 25b0a5b73b..be8679224f 100644
--- a/docs/es/docs/tutorial/response-model.md
+++ b/docs/es/docs/tutorial/response-model.md
@@ -66,7 +66,7 @@ De esta manera puedes añadir anotaciones de tipos correctas a tus funciones inc
También puedes usar `response_model=None` para desactivar la creación de un modelo de response para esa *path operation*, podrías necesitar hacerlo si estás añadiendo anotaciones de tipos para cosas que no son campos válidos de Pydantic, verás un ejemplo de eso en una de las secciones a continuación.
-## Devolver los mismos datos de entrada { #return-the-same-input-data }
+## Devuelve los mismos datos de entrada { #return-the-same-input-data }
Aquí estamos declarando un modelo `UserIn`, contendrá una contraseña en texto plano:
@@ -106,7 +106,7 @@ Nunca almacenes la contraseña en texto plano de un usuario ni la envíes en un
///
-## Añadir un modelo de salida { #add-an-output-model }
+## Añade un modelo de salida { #add-an-output-model }
Podemos en cambio crear un modelo de entrada con la contraseña en texto plano y un modelo de salida sin ella:
@@ -146,7 +146,7 @@ Y en esos casos, podemos usar clases y herencia para aprovechar las **anotacione
Con esto, obtenemos soporte de las herramientas, de los editores y mypy ya que este código es correcto en términos de tipos, pero también obtenemos el filtrado de datos de FastAPI.
-¿Cómo funciona esto? Vamos a echarle un vistazo. 🤓
+¿Cómo funciona esto? Vamos a revisarlo. 🤓
### Anotaciones de Tipos y Herramientas { #type-annotations-and-tooling }
@@ -166,9 +166,9 @@ FastAPI realiza varias cosas internamente con Pydantic para asegurarse de que es
De esta manera, puedes obtener lo mejor de ambos mundos: anotaciones de tipos con **soporte de herramientas** y **filtrado de datos**.
-## Verlo en la documentación { #see-it-in-the-docs }
+## Véelo en la documentación { #see-it-in-the-docs }
-Cuando veas la documentación automática, puedes verificar que el modelo de entrada y el modelo de salida tendrán cada uno su propio JSON Schema:
+Cuando veas la documentación automática, puedes revisar que el modelo de entrada y el modelo de salida tendrán cada uno su propio JSON Schema:
@@ -180,7 +180,7 @@ Y ambos modelos se utilizarán para la documentación interactiva de la API:
Podría haber casos en los que devuelvas algo que no es un campo válido de Pydantic y lo anotes en la función, solo para obtener el soporte proporcionado por las herramientas (el editor, mypy, etc).
-### Devolver un Response Directamente { #return-a-response-directly }
+### Devuelve un Response Directamente { #return-a-response-directly }
El caso más común sería [devolver un Response directamente como se explica más adelante en la documentación avanzada](../advanced/response-directly.md).
@@ -190,7 +190,7 @@ Este caso simple es manejado automáticamente por FastAPI porque la anotación d
Y las herramientas también estarán felices porque tanto `RedirectResponse` como `JSONResponse` son subclases de `Response`, por lo que la anotación del tipo es correcta.
-### Anotar una Subclase de Response { #annotate-a-response-subclass }
+### Anota una Subclase de Response { #annotate-a-response-subclass }
También puedes usar una subclase de `Response` en la anotación del tipo:
@@ -208,7 +208,7 @@ Lo mismo sucedería si tuvieras algo como una