-## Cambiar el tema { #change-the-theme }
+## Cambia el tema { #change-the-theme }
De la misma manera, podrías configurar el tema del resaltado de sintaxis con la clave `"syntaxHighlight.theme"` (ten en cuenta que tiene un punto en el medio):
@@ -34,7 +34,7 @@ Esa configuración cambiaría el tema de color del resaltado de sintaxis:
-## Cambiar los parámetros por defecto de Swagger UI { #change-default-swagger-ui-parameters }
+## Cambia los parámetros por defecto de Swagger UI { #change-default-swagger-ui-parameters }
FastAPI incluye algunos parámetros de configuración por defecto apropiados para la mayoría de los casos de uso.
diff --git a/docs/es/docs/how-to/custom-request-and-route.md b/docs/es/docs/how-to/custom-request-and-route.md
index 56013a5c7b..5b4d8570f3 100644
--- a/docs/es/docs/how-to/custom-request-and-route.md
+++ b/docs/es/docs/how-to/custom-request-and-route.md
@@ -18,8 +18,8 @@ Si apenas estás comenzando con **FastAPI**, quizás quieras saltar esta secció
Algunos casos de uso incluyen:
-* Convertir cuerpos de requests no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).
-* Descomprimir cuerpos de requests comprimidos con gzip.
+* Convertir request bodies no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).
+* Descomprimir request bodies comprimidos con gzip.
* Registrar automáticamente todos los request bodies.
## Manejo de codificaciones personalizadas de request body { #handling-custom-request-body-encodings }
@@ -32,7 +32,7 @@ Y una subclase de `APIRoute` para usar esa clase de request personalizada.
/// tip | Consejo
-Este es un ejemplo sencillo para demostrar cómo funciona. Si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.
+Este es un ejemplo de juguete para demostrar cómo funciona, si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.
///
@@ -60,11 +60,11 @@ Aquí lo usamos para crear un `GzipRequest` a partir del request original.
Un `Request` tiene un atributo `request.scope`, que es simplemente un `dict` de Python que contiene los metadatos relacionados con el request.
-Un `Request` también tiene un `request.receive`, que es una función para "recibir" el request body.
+Un `Request` también tiene un `request.receive`, que es una función para "recibir" el body del request.
El `dict` `scope` y la función `receive` son ambos parte de la especificación ASGI.
-Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva *Request instance*.
+Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva instance de `Request`.
Para aprender más sobre el `Request`, revisa [la documentación de Starlette sobre Requests](https://www.starlette.dev/requests/).
@@ -94,7 +94,7 @@ Todo lo que necesitamos hacer es manejar el request dentro de un bloque `try`/`e
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}
-Si ocurre una excepción, la `Request instance` aún estará en el alcance, así que podemos leer y hacer uso del request body cuando manejamos el error:
+Si 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:
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}
diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md
index 11c0cc23c5..a58a11764d 100644
--- a/docs/es/docs/how-to/graphql.md
+++ b/docs/es/docs/how-to/graphql.md
@@ -29,7 +29,7 @@ Aquí algunos de los paquetes de **GraphQL** que tienen soporte **ASGI**. Podrí
## GraphQL con Strawberry { #graphql-with-strawberry }
-Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene un diseño muy similar al diseño de **FastAPI**, todo basado en **anotaciones de tipos**.
+Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene el diseño más cercano al diseño de **FastAPI**, todo basado en **anotaciones de tipos**.
Dependiendo de tu caso de uso, podrías preferir usar un paquete diferente, pero si me preguntas, probablemente te sugeriría probar **Strawberry**.
diff --git a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
index 22d51674d0..571554cad2 100644
--- a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
+++ b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -8,6 +8,8 @@ FastAPI versión 0.119.0 introdujo compatibilidad parcial con Pydantic v1 desde
FastAPI 0.126.0 eliminó la compatibilidad con Pydantic v1, aunque siguió soportando `pydantic.v1` por un poquito más de tiempo.
+FastAPI 0.128.0 también eliminó la compatibilidad con `pydantic.v1`, así que las versiones más recientes de FastAPI requieren Pydantic v2.
+
/// warning | Advertencia
El equipo de Pydantic dejó de dar soporte a Pydantic v1 para las versiones más recientes de Python, comenzando con **Python 3.14**.
@@ -54,6 +56,16 @@ Esto significa que puedes instalar la versión más reciente de Pydantic v2 e im
### Compatibilidad de FastAPI con Pydantic v1 en v2 { #fastapi-support-for-pydantic-v1-in-v2 }
+/// warning | Advertencia
+
+Esta compatibilidad de FastAPI con modelos de `pydantic.v1` se añadió en **FastAPI 0.119.0** y se eliminó en **FastAPI 0.128.0**. Estaba pensada para ser una ayuda temporal para la migración a Pydantic v2.
+
+En las versiones actuales de FastAPI, usar un modelo de `pydantic.v1` en tu app generará un error.
+
+El resto de esta sección describe la compatibilidad temporal disponible solo en esas versiones antiguas.
+
+///
+
Desde FastAPI 0.119.0, también hay compatibilidad parcial para Pydantic v1 desde dentro de Pydantic v2, para facilitar la migración a v2.
Así que podrías actualizar Pydantic a la última versión 2 y cambiar los imports para usar el submódulo `pydantic.v1`, y en muchos casos simplemente funcionaría.
@@ -122,6 +134,12 @@ Si necesitas usar algunas de las herramientas específicas de FastAPI para pará
### Migra por pasos { #migrate-in-steps }
+/// warning | Advertencia
+
+La migración gradual usando tanto modelos de Pydantic v1 como de v2 en la misma app descrita abajo solo funciona en **FastAPI 0.119.0 a 0.127.x**. Se eliminó en **FastAPI 0.128.0**, las versiones más recientes requieren modelos de **Pydantic v2**.
+
+///
+
/// tip | Consejo
Primero prueba con `bump-pydantic`, si tus tests pasan y eso funciona, entonces terminaste con un solo comando. ✨
diff --git a/docs/es/docs/how-to/separate-openapi-schemas.md b/docs/es/docs/how-to/separate-openapi-schemas.md
index 1026085e05..14990a79a4 100644
--- a/docs/es/docs/how-to/separate-openapi-schemas.md
+++ b/docs/es/docs/how-to/separate-openapi-schemas.md
@@ -77,7 +77,7 @@ Pero para `Item-Output`, `description` **es requerido**, tiene un asterisco rojo
Con esta funcionalidad de **Pydantic v2**, la documentación de tu API es más **precisa**, y si tienes clientes y SDKs autogenerados, también serán más precisos, con una mejor **experiencia para desarrolladores** y consistencia. 🎉
-## No Separar Esquemas { #do-not-separate-schemas }
+## No separes esquemas { #do-not-separate-schemas }
Ahora, hay algunos casos donde podrías querer tener el **mismo esquema para entrada y salida**.
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index 58d534eef7..7a9caec516 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -45,7 +45,7 @@ Las funcionalidades clave son:
* **Rápido**: Muy alto rendimiento, a la par con **NodeJS** y **Go** (gracias a Starlette y Pydantic). [Uno de los frameworks Python más rápidos disponibles](#performance).
* **Rápido de programar**: Aumenta la velocidad para desarrollar funcionalidades en aproximadamente un 200% a 300%. *
* **Menos bugs**: Reduce en aproximadamente un 40% los errores inducidos por humanos (desarrolladores). *
-* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando.
+* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando.
* **Fácil**: Diseñado para ser fácil de usar y aprender. Menos tiempo leyendo documentación.
* **Corto**: Minimiza la duplicación de código. Múltiples funcionalidades desde cada declaración de parámetro. Menos bugs.
* **Robusto**: Obtén código listo para producción. Con documentación interactiva automática.
@@ -479,7 +479,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al Inyección de Dependencias** muy poderoso y fácil de usar.
+* Un sistema de **Inyección de Dependencias** muy poderoso y fácil de usar.
* Seguridad y autenticación, incluyendo soporte para **OAuth2** con **tokens JWT** y autenticación **HTTP Basic**.
* Técnicas más avanzadas (pero igualmente fáciles) para declarar **modelos JSON profundamente anidados** (gracias a Pydantic).
* Integración con **GraphQL** usando [Strawberry](https://strawberry.rocks) y otros paquetes.
diff --git a/docs/es/docs/project-generation.md b/docs/es/docs/project-generation.md
index 11a560eba6..fd0fd70177 100644
--- a/docs/es/docs/project-generation.md
+++ b/docs/es/docs/project-generation.md
@@ -9,18 +9,18 @@ Repositorio de GitHub: [Plantilla Full Stack FastAPI](https://github.com/tiangol
## Plantilla Full Stack FastAPI - Stack de tecnología y funcionalidades { #full-stack-fastapi-template-technology-stack-and-features }
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/es) para la API del backend en Python.
- - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM).
- - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validación de datos y gestión de configuraciones.
- - 💾 [PostgreSQL](https://www.postgresql.org) como base de datos SQL.
+ - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM).
+ - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validación de datos y gestión de configuraciones.
+ - 💾 [PostgreSQL](https://www.postgresql.org) como base de datos SQL.
- 🚀 [React](https://react.dev) para el frontend.
- - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend.
- - 🎨 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend.
- - 🤖 Un cliente de frontend generado automáticamente.
- - 🧪 [Playwright](https://playwright.dev) para escribir pruebas End-to-End.
- - 🦇 Soporte para modo oscuro.
+ - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend.
+ - 🎨 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend.
+ - 🤖 Un cliente de frontend generado automáticamente.
+ - 🧪 [Playwright](https://playwright.dev) para escribir pruebas End-to-End.
+ - 🦇 Soporte para modo oscuro.
- 🐋 [Docker Compose](https://www.docker.com) para desarrollo y producción.
- 🔒 Hashing seguro de contraseñas por defecto.
-- 🔑 Autenticación con tokens JWT.
+- 🔑 Autenticación con JWT (JSON Web Token).
- 📫 Recuperación de contraseñas basada en email.
- ✅ Pruebas con [Pytest](https://pytest.org).
- 📞 [Traefik](https://traefik.io) como proxy inverso / load balancer.
diff --git a/docs/es/docs/python-types.md b/docs/es/docs/python-types.md
index 878c8be03d..6a13b97eb2 100644
--- a/docs/es/docs/python-types.md
+++ b/docs/es/docs/python-types.md
@@ -1,8 +1,8 @@
# Introducción a Tipos en Python { #python-types-intro }
-Python tiene soporte para "anotaciones de tipos" opcionales (también llamadas "type hints").
+Python tiene soporte para "anotaciones de tipos" opcionales (también llamadas "anotaciones de tipos").
-Estas **"anotaciones de tipos"** o type hints son una sintaxis especial que permite declarar el tipo de una variable.
+Estas **"anotaciones de tipos"** o anotaciones son una sintaxis especial que permite declarar el tipo de una variable.
Al declarar tipos para tus variables, los editores y herramientas te pueden proporcionar un mejor soporte.
@@ -44,7 +44,7 @@ Es un programa muy simple.
Pero ahora imagina que lo escribieras desde cero.
-En algún momento habrías empezado la definición de la función, tenías los parámetros listos...
+En algún momento empiezas a definir la función, y tienes los parámetros listos...
Pero luego tienes que llamar "ese método que convierte la primera letra a mayúscula".
@@ -58,7 +58,7 @@ Pero, tristemente, no obtienes nada útil:
-### Añadir tipos { #add-types }
+### Añade tipos { #add-types }
Modifiquemos una sola línea de la versión anterior.
@@ -120,7 +120,7 @@ Ahora sabes que debes corregirlo, convertir `age` a un string con `str(age)`:
Acabas de ver el lugar principal para declarar anotaciones de tipos. Como parámetros de función.
-Este también es el lugar principal donde los utilizarías con **FastAPI**.
+Este también es el lugar principal donde las utilizarías con **FastAPI**.
### Tipos simples { #simple-types }
@@ -137,7 +137,7 @@ Puedes usar, por ejemplo:
### Módulo `typing` { #typing-module }
-Para algunos casos adicionales, podrías necesitar importar algunas cosas del módulo `typing` de la standard library, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`:
+Para algunos casos adicionales, podrías necesitar importar algunas cosas del módulo `typing` del paquete estándar, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`:
```python
from typing import Any
@@ -149,7 +149,7 @@ def some_function(data: Any):
### Tipos genéricos { #generic-types }
-Algunos tipos pueden tomar "parámetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "lista de strings" se declararía `list[str]`.
+Algunos tipos pueden tomar "parámetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "list de strings" se declararía `list[str]`.
Estos tipos que pueden tomar parámetros de tipo se llaman **Tipos Genéricos** o **Genéricos**.
@@ -160,7 +160,7 @@ Puedes usar los mismos tipos integrados como genéricos (con corchetes y tipos d
* `set`
* `dict`
-#### Lista { #list }
+#### List { #list }
Por ejemplo, vamos a definir una variable para ser una `list` de `str`.
@@ -168,7 +168,7 @@ Declara la variable, con la misma sintaxis de dos puntos (`:`).
Como tipo, pon `list`.
-Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes:
+Como la `list` es un tipo que contiene algunos tipos internos, los pones entre corchetes:
{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
@@ -180,15 +180,15 @@ En este caso, `str` es el parámetro de tipo pasado a `list`.
///
-Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta lista es un `str`".
+Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta `list` es un `str`".
-Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la lista:
+Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la `list`:
Sin tipos, eso es casi imposible de lograr.
-Nota que la variable `item` es uno de los elementos en la lista `items`.
+Nota que la variable `item` es uno de los elementos en la `list` `items`.
Y aún así, el editor sabe que es un `str` y proporciona soporte para eso.
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index f45b4912a9..31688d8abe 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@ Digamos que tienes una estructura de archivos como esta:
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | Consejo
@@ -181,12 +181,12 @@ El resultado final es que los paths de item son ahora:
...como pretendíamos.
* Serán marcados con una lista de tags que contiene un solo string `"items"`.
- * Estos "tags" son especialmente útiles para los sistemas de documentación interactiva automática (usando OpenAPI).
+ * Estos "tags" son especialmente útiles para los sistemas de documentación interactiva automática (usando OpenAPI).
* Todos incluirán las `responses` predefinidas.
* Todas estas *path operations* tendrán la lista de `dependencies` evaluadas/ejecutadas antes de ellas.
- * Si también declaras dependencias en una *path operation* específica, **también se ejecutarán**.
- * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parámetros normales.
- * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md).
+ * Si también declaras dependencias en una *path operation* específica, **también se ejecutarán**.
+ * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parámetros normales.
+ * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md).
/// tip | Consejo
@@ -461,7 +461,7 @@ Los `APIRouter`s no están "montados", no están aislados del resto de la aplica
Esto se debe a que queremos incluir sus *path operations* en el esquema de OpenAPI y las interfaces de usuario.
-FastAPI mantiene los routers y *path operations* originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI.
+FastAPI mantiene los routers y path operations originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI.
///
diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md
index 14151a036c..3ca5860148 100644
--- a/docs/es/docs/tutorial/body-nested-models.md
+++ b/docs/es/docs/tutorial/body-nested-models.md
@@ -23,7 +23,7 @@ pasa el/los tipo(s) interno(s) como "parámetros de tipo" usando corchetes: `[`
my_list: list[str]
```
-Eso es toda la sintaxis estándar de Python para declaraciones de tipo.
+Esa es toda la sintaxis estándar de Python para declaraciones de tipo.
Usa esa misma sintaxis estándar para atributos de modelos con tipos internos.
diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md
index a87512da28..a71b81a40d 100644
--- a/docs/es/docs/tutorial/body.md
+++ b/docs/es/docs/tutorial/body.md
@@ -1,5 +1,6 @@
# Request Body { #request-body }
+
Cuando necesitas enviar datos desde un cliente (digamos, un navegador) a tu API, los envías como un **request body**.
Un **request** body es un dato enviado por el cliente a tu API. Un **response** body es el dato que tu API envía al cliente.
diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md
index d91a326168..95e19c1494 100644
--- a/docs/es/docs/tutorial/debugging.md
+++ b/docs/es/docs/tutorial/debugging.md
@@ -1,5 +1,6 @@
# Depuración { #debugging }
+
Puedes conectar el depurador en tu editor, por ejemplo con Visual Studio Code o PyCharm.
## Llama a `uvicorn` { #call-uvicorn }
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
index 552c98ed0a..aab8eca7b5 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -234,6 +234,7 @@ participant operation as Path Operation
Las dependencias con `yield` han evolucionado con el tiempo para cubrir diferentes casos de uso y corregir algunos problemas.
Si quieres ver qué ha cambiado en diferentes versiones de FastAPI, puedes leer más al respecto en la guía avanzada, en [Dependencias avanzadas - Dependencias con `yield`, `HTTPException`, `except` y Tareas en Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
+
## Context Managers { #context-managers }
### Qué son los "Context Managers" { #what-are-context-managers }
diff --git a/docs/es/docs/tutorial/extra-data-types.md b/docs/es/docs/tutorial/extra-data-types.md
index b92d0fcd48..bd5fdc0737 100644
--- a/docs/es/docs/tutorial/extra-data-types.md
+++ b/docs/es/docs/tutorial/extra-data-types.md
@@ -1,5 +1,6 @@
# Tipos de Datos Extra { #extra-data-types }
+
Hasta ahora, has estado usando tipos de datos comunes, como:
* `int`
diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md
index 4a3b75b5bc..903a13c700 100644
--- a/docs/es/docs/tutorial/extra-models.md
+++ b/docs/es/docs/tutorial/extra-models.md
@@ -208,4 +208,4 @@ En este caso, puedes usar `dict`:
Usa múltiples modelos Pydantic y hereda libremente para cada caso.
-No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". Como el caso con la "entidad" usuario con un estado que incluye `password`, `password_hash` y sin contraseña.
+No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". La "entidad" **usuario** es un ejemplo, con estados que incluyen `password`, `password_hash` o ninguna contraseña.
diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md
index 5aaf8bdfa6..61e5f40993 100644
--- a/docs/es/docs/tutorial/first-steps.md
+++ b/docs/es/docs/tutorial/first-steps.md
@@ -90,13 +90,13 @@ Verás la documentación alternativa automática (proporcionada por [ReDoc](http
Un "esquema" es una definición o descripción de algo. No el código que lo implementa, sino solo una descripción abstracta.
-#### Esquema de la API { #api-schema }
+#### "Esquema" de la API { #api-schema }
En este caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) es una especificación que dicta cómo definir un esquema de tu API.
Esta definición de esquema incluye los paths de tu API, los posibles parámetros que toman, etc.
-#### Esquema de Datos { #data-schema }
+#### "Esquema" de datos { #data-schema }
El término "esquema" también podría referirse a la forma de algunos datos, como el contenido JSON.
@@ -194,7 +194,7 @@ O, también puedes pasar la opción `--entrypoint` al comando `fastapi dev`:
$ fastapi dev --entrypoint main:app
```
-Pero tendrías que recordar pasar el path o entrypoint correctos cada vez que llames al comando `fastapi`.
+Pero tendrías que recordar pasar el path\entrypoint correcto cada vez que llames al comando `fastapi`.
Además, otras herramientas podrían no ser capaces de encontrarlo, por ejemplo la [Extensión de VS Code](../editor-support.md) o [FastAPI Cloud](https://fastapicloud.com), así que se recomienda usar el `entrypoint` en `pyproject.toml`.
@@ -301,7 +301,7 @@ Normalmente usas:
* `PUT`: para actualizar datos.
* `DELETE`: para eliminar datos.
-Así que, en OpenAPI, cada uno de los métodos HTTP se llama una "operation".
+Así que, en OpenAPI, cada uno de los métodos HTTP se llama una "operación".
Vamos a llamarlas "**operaciones**" también.
diff --git a/docs/es/docs/tutorial/handling-errors.md b/docs/es/docs/tutorial/handling-errors.md
index 737c43e41b..f640642317 100644
--- a/docs/es/docs/tutorial/handling-errors.md
+++ b/docs/es/docs/tutorial/handling-errors.md
@@ -101,7 +101,7 @@ Así que recibirás un error limpio, con un código de estado HTTP de `418` y un
{"message": "Oops! yolo did something. There goes a rainbow..."}
```
-/// note | Nota Técnica
+/// note | Detalles Técnicos
También podrías usar `from starlette.requests import Request` y `from starlette.responses import JSONResponse`.
@@ -109,11 +109,11 @@ También podrías usar `from starlette.requests import Request` y `from starlett
///
-## Sobrescribir los manejadores de excepciones predeterminados { #override-the-default-exception-handlers }
+## Sobrescribir los manejadores de excepciones por defecto { #override-the-default-exception-handlers }
-**FastAPI** tiene algunos manejadores de excepciones predeterminados.
+**FastAPI** tiene algunos manejadores de excepciones por defecto.
-Estos manejadores se encargan de devolver los responses JSON predeterminadas cuando lanzas un `HTTPException` y cuando el request tiene datos inválidos.
+Estos manejadores se encargan de devolver los responses JSON por defecto cuando lanzas un `HTTPException` y cuando el request tiene datos inválidos.
Puedes sobrescribir estos manejadores de excepciones con los tuyos propios.
@@ -121,7 +121,7 @@ Puedes sobrescribir estos manejadores de excepciones con los tuyos propios.
Cuando un request contiene datos inválidos, **FastAPI** lanza internamente un `RequestValidationError`.
-Y también incluye un manejador de excepciones predeterminado para ello.
+Y también incluye un manejador de excepciones por defecto para ello.
Para sobrescribirlo, importa el `RequestValidationError` y úsalo con `@app.exception_handler(RequestValidationError)` para decorar el manejador de excepciones.
@@ -161,7 +161,7 @@ Por ejemplo, podrías querer devolver un response de texto plano en lugar de JSO
{* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *}
-/// note | Nota Técnica
+/// note | Detalles Técnicos
También podrías usar `from starlette.responses import PlainTextResponse`.
@@ -237,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
### Reutilizar los manejadores de excepciones de **FastAPI** { #reuse-fastapis-exception-handlers }
-Si quieres usar la excepción junto con los mismos manejadores de excepciones predeterminados de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones predeterminados de `fastapi.exception_handlers`:
+Si quieres usar la excepción junto con los mismos manejadores de excepciones por defecto de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones por defecto de `fastapi.exception_handlers`:
{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
-En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones predeterminados.
+En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones por defecto.
diff --git a/docs/es/docs/tutorial/index.md b/docs/es/docs/tutorial/index.md
index 414e865b27..59b9e41641 100644
--- a/docs/es/docs/tutorial/index.md
+++ b/docs/es/docs/tutorial/index.md
@@ -54,7 +54,7 @@ $ fastapi dev
Es **ALTAMENTE recomendable** que escribas o copies el código, lo edites y lo ejecutes localmente.
-Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuán poco código tienes que escribir, todos los chequeos de tipos, autocompletado, etc.
+Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuán poco código tienes que escribir, todo el chequeo de tipos, autocompletado, etc.
---
diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md
index 9dd9088dab..d8b7176d5b 100644
--- a/docs/es/docs/tutorial/metadata.md
+++ b/docs/es/docs/tutorial/metadata.md
@@ -1,4 +1,4 @@
-# Metadata y URLs de Docs { #metadata-and-docs-urls }
+# Metadata y URLs de documentación { #metadata-and-docs-urls }
Puedes personalizar varias configuraciones de metadata en tu aplicación **FastAPI**.
@@ -11,7 +11,7 @@ Puedes establecer los siguientes campos que se usan en la especificación OpenAP
| `title` | `str` | El título de la API. |
| `summary` | `str` | Un resumen corto de la API. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Una breve descripción de la API. Puede usar Markdown. |
-| `version` | `string` | La versión de la API. Esta es la versión de tu propia aplicación, no de OpenAPI. Por ejemplo, `2.5.0`. |
+| `version` | `str` | La versión de la API. Esta es la versión de tu propia aplicación, no de OpenAPI. Por ejemplo, `2.5.0`. |
| `terms_of_service` | `str` | Una URL a los Términos de Servicio para la API. Si se proporciona, debe ser una URL. |
| `contact` | `dict` | La información de contacto para la API expuesta. Puede contener varios campos. contact fields| Parámetro | Tipo | Descripción |
|---|---|---|
name | str | El nombre identificativo de la persona/organización de contacto. |
url | str | La URL que apunta a la información de contacto. DEBE tener el formato de una URL. |
email | str | La dirección de correo electrónico de la persona/organización de contacto. DEBE tener el formato de una dirección de correo. |
license_info fields| Parámetro | Tipo | Descripción |
|---|---|---|
name | str | REQUERIDO (si se establece un license_info). El nombre de la licencia utilizada para la API. |
identifier | str | Una expresión de licencia [SPDX](https://spdx.org/licenses/) para la API. El campo identifier es mutuamente excluyente del campo url. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Una URL a la licencia utilizada para la API. DEBE tener el formato de una URL. |
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index 01c2e40519..fab02dd35f 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -18,7 +18,7 @@ Tener `str | None` permitirá que tu editor te dé un mejor soporte y detecte er
## Validaciones adicionales { #additional-validation }
-Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, su longitud no exceda los 50 caracteres.
+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 }
@@ -69,7 +69,7 @@ Ahora que tenemos este `Annotated` donde podemos poner más información (en est
Nota que el valor por defecto sigue siendo `None`, por lo que el parámetro sigue siendo opcional.
-Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga validación adicional para este valor, queremos que tenga un máximo de 50 caracteres. 😎
+Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga **validación adicional** para este valor, queremos que tenga un máximo de 50 caracteres. 😎
/// tip | Consejo
@@ -79,9 +79,9 @@ Aquí estamos usando `Query()` porque este es un **parámetro de query**. Más a
FastAPI ahora:
-* Validará los datos asegurándose de que la longitud máxima sea de 50 caracteres
-* Mostrará un error claro para el cliente cuando los datos no sean válidos
-* Documentará el parámetro en el OpenAPI esquema *path operation* (así aparecerá en la UI de documentación automática)
+* **Validará** los datos asegurándose de que la longitud máxima sea de 50 caracteres
+* Mostrará un **error claro** para el cliente cuando los datos no sean válidos
+* **Documentará** el parámetro en el esquema de OpenAPI *path operation* (así aparecerá en la **UI de documentación automática**)
## Alternativa (antigua): `Query` como valor por defecto { #alternative-old-query-as-the-default-value }
@@ -120,7 +120,7 @@ Luego, podemos pasar más parámetros a `Query`. En este caso, el parámetro `ma
q: str | None = Query(default=None, max_length=50)
```
-Esto validará los datos, mostrará un error claro cuando los datos no sean válidos, y documentará el parámetro en el esquema del *path operation* de OpenAPI.
+Esto validará los datos, mostrará un error claro cuando los datos no sean válidos, y documentará el parámetro en el esquema de OpenAPI *path operation*.
### `Query` como valor por defecto o en `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -150,13 +150,13 @@ q: str = Query(default="rick")
### Ventajas de `Annotated` { #advantages-of-annotated }
-Usar `Annotated` es recomendado en lugar del valor por defecto en los parámetros de función, es mejor por múltiples razones. 🤓
+**Usar `Annotated` es recomendado** en lugar del valor por defecto en los parámetros de función, es **mejor** por múltiples razones. 🤓
-El valor por defecto del parámetro de función es el valor real por defecto, eso es más intuitivo con Python en general. 😌
+El valor **por defecto** del **parámetro de función** es el **valor real por defecto**, eso es más intuitivo con Python en general. 😌
-Podrías llamar a esa misma función en otros lugares sin FastAPI, y funcionaría como se espera. Si hay un parámetro requerido (sin un valor por defecto), tu editor te avisará con un error, Python también se quejará si lo ejecutas sin pasar el parámetro requerido.
+Podrías **llamar** a esa misma función en **otros lugares** sin FastAPI, y **funcionaría como se espera**. Si hay un parámetro **requerido** (sin un valor por defecto), tu **editor** te avisará con un error, **Python** también se quejará si lo ejecutas sin pasar el parámetro requerido.
-Cuando no usas `Annotated` y en su lugar usas el estilo de valor por defecto (antiguo), si llamas a esa función sin FastAPI en otros lugares, tienes que recordar pasar los argumentos a la función para que funcione correctamente, de lo contrario, los valores serán diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejará, y Python no se quejará al ejecutar esa función, solo cuando los errores dentro de las operaciones hagan que funcione incorrectamente.
+Cuando no usas `Annotated` y en su lugar usas el **estilo de valor por defecto (antiguo)**, si llamas a esa función sin FastAPI en **otros lugares**, tienes que **recordar** pasar los argumentos a la función para que funcione correctamente, de lo contrario, los valores serán diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejará, y Python no se quejará al ejecutar esa función, solo cuando las operaciones internas generen errores.
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/). 🚀
@@ -172,13 +172,13 @@ Puedes definir una ISBN o con `imdb-` para un ID de URL de película de IMDB:
+Por ejemplo, este validador personalizado revisa que el ID del ítem empiece con `isbn-` para un número de libro ISBN o con `imdb-` para un ID de URL de película de IMDB:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
@@ -390,15 +390,15 @@ Esto está disponible con Pydantic versión 2 o superior. 😎
/// tip | Consejo
-Si necesitas hacer cualquier tipo de validación que requiera comunicarte con algún componente externo, como una base de datos u otra API, deberías usar Dependencias de FastAPI, las aprenderás más adelante.
+Si necesitas hacer cualquier tipo de validación que requiera comunicarte con algún **componente externo**, como una base de datos u otra API, deberías usar **Dependencias de FastAPI**, las aprenderás más adelante.
-Estos validadores personalizados son para cosas que pueden comprobarse solo con los mismos datos provistos en el request.
+Estos validadores personalizados son para cosas que pueden revisarse **solo** con los **mismos datos** provistos en el request.
///
### Entiende ese código { #understand-that-code }
-El punto importante es solo usar `AfterValidator` con una función dentro de `Annotated`. Si quieres, sáltate esta parte. 🤸
+El punto importante es solo usar **`AfterValidator` con una función dentro de `Annotated`**. Si quieres, sáltate esta parte. 🤸
---
@@ -406,7 +406,7 @@ Pero si te da curiosidad este ejemplo de código específico y sigues entretenid
#### String con `value.startswith()` { #string-with-value-startswith }
-¿Lo notaste? un string usando `value.startswith()` puede recibir una tupla, y comprobará cada valor en la tupla:
+¿Lo notaste? Un string usando `value.startswith()` puede recibir una tupla, y revisará cada valor en la tupla:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
@@ -416,13 +416,13 @@ Con `data.items()` obtenemos un `) envían los datos al
/// note | Detalles Técnicos
-Los datos de los forms normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos.
+Los datos de los formularios normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos.
Pero cuando el formulario incluye archivos, se codifica como `multipart/form-data`. Si usas `File`, **FastAPI** sabrá que tiene que obtener los archivos de la parte correcta del cuerpo.
diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md
index 60722a2612..640e022821 100644
--- a/docs/es/docs/tutorial/request-forms.md
+++ b/docs/es/docs/tutorial/request-forms.md
@@ -14,13 +14,13 @@ $ pip install python-multipart
///
-## Importar `Form` { #import-form }
+## Importa `Form` { #import-form }
-Importar `Form` desde `fastapi`:
+Importa `Form` desde `fastapi`:
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *}
-## Definir parámetros de `Form` { #define-form-parameters }
+## Define parámetros de `Form` { #define-form-parameters }
Crea parámetros de formulario de la misma manera que lo harías para `Body` o `Query`:
diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md
index 4b9f0e2340..2e0b88c5d0 100644
--- a/docs/es/docs/tutorial/response-status-code.md
+++ b/docs/es/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Código de Estado del Response { #response-status-code }
+
De la misma manera que puedes especificar un modelo de response, también puedes declarar el código de estado HTTP usado para el response con el parámetro `status_code` en cualquiera de las *path operations*:
* `@app.get()`
diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md
index fba7215ef0..310697d0b3 100644
--- a/docs/es/docs/tutorial/schema-extra-example.md
+++ b/docs/es/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Declarar Datos de Ejemplo de Request { #declare-request-example-data }
+# Declara Datos de Ejemplo de Request { #declare-request-example-data }
Puedes declarar ejemplos de los datos que tu aplicación puede recibir.
diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md
index e4755f9517..a8df7e9a55 100644
--- a/docs/es/docs/tutorial/security/first-steps.md
+++ b/docs/es/docs/tutorial/security/first-steps.md
@@ -146,7 +146,7 @@ Usar una URL relativa es importante para asegurarse de que tu aplicación siga f
Este parámetro no crea ese endpoint / *path operation*, pero declara que la URL `/token` será la que el cliente deberá usar para obtener el token. Esa información se usa en OpenAPI, y luego en los sistemas de documentación interactiva del API.
-Pronto también crearemos la verdadera *path operation*.
+Pronto también crearemos la path operation real.
/// note | Nota
@@ -174,13 +174,13 @@ Ahora puedes pasar ese `oauth2_scheme` en una dependencia con `Depends`.
Esta dependencia proporcionará un `str` que se asigna al parámetro `token` de la *path operation function*.
-**FastAPI** sabrá que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en los docs automáticos del API).
+**FastAPI** sabrá que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en la documentación automática de la API).
/// note | Detalles técnicos
**FastAPI** sabrá que puede usar la clase `OAuth2PasswordBearer` (declarada en una dependencia) para definir el esquema de seguridad en OpenAPI porque hereda de `fastapi.security.oauth2.OAuth2`, que a su vez hereda de `fastapi.security.base.SecurityBase`.
-Todas las utilidades de seguridad que se integran con OpenAPI (y los docs automáticos del API) heredan de `SecurityBase`, así es como **FastAPI** puede saber cómo integrarlas en OpenAPI.
+Todas las utilidades de seguridad que se integran con OpenAPI (y la documentación automática de la API) heredan de `SecurityBase`, así es como **FastAPI** puede saber cómo integrarlas en OpenAPI.
///
diff --git a/docs/es/docs/tutorial/security/get-current-user.md b/docs/es/docs/tutorial/security/get-current-user.md
index fd331f68ea..a47cfb0bcc 100644
--- a/docs/es/docs/tutorial/security/get-current-user.md
+++ b/docs/es/docs/tutorial/security/get-current-user.md
@@ -4,7 +4,9 @@ En el capítulo anterior, el sistema de seguridad (que se basa en el sistema de
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
-Pero eso aún no es tan útil. Vamos a hacer que nos dé el usuario actual.
+Pero eso aún no es tan útil.
+
+Vamos a hacer que nos dé el usuario actual.
## Crear un modelo de usuario { #create-a-user-model }
@@ -12,7 +14,7 @@ Primero, vamos a crear un modelo de usuario con Pydantic.
De la misma manera que usamos Pydantic para declarar cuerpos, podemos usarlo en cualquier otra parte:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Crear una dependencia `get_current_user` { #create-a-get-current-user-dependency }
@@ -66,7 +68,7 @@ Y puedes usar cualquier modelo o datos para los requisitos de seguridad (en este
Pero no estás limitado a usar algún modelo de datos, clase o tipo específico.
-¿Quieres tener un `id` y `email` y no tener un `username` en tu modelo? Claro. Puedes usar estas mismas herramientas.
+¿Quieres tener un `id` y `email` y no tener ningún `username` en tu modelo? Claro. Puedes usar estas mismas herramientas.
¿Quieres solo tener un `str`? ¿O solo un `dict`? ¿O un instance de clase modelo de base de datos directamente? Todo funciona de la misma manera.
diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md
index efd309df90..5b74ffd110 100644
--- a/docs/es/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/es/docs/tutorial/security/oauth2-jwt.md
@@ -1,5 +1,6 @@
# OAuth2 con Password (y hashing), Bearer con tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
+
Ahora que tenemos todo el flujo de seguridad, hagamos que la aplicación sea realmente segura, usando tokens JWT y hashing de contraseñas seguras.
Este código es algo que puedes usar realmente en tu aplicación, guardar los hashes de las contraseñas en tu base de datos, etc.
diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md
index 2a98fff6ca..d3e2bd2cb6 100644
--- a/docs/es/docs/tutorial/security/simple-oauth2.md
+++ b/docs/es/docs/tutorial/security/simple-oauth2.md
@@ -146,7 +146,7 @@ UserInDB(
/// note | Nota
-Para una explicación más completa de `**user_dict` revisa en [la documentación para **Extra Models**](../extra-models.md#about-user-in-dict).
+Para una explicación más completa de `**user_dict` revisa en [la documentación para **Extra Models**](../extra-models.md#about-user-in-model-dump).
///
diff --git a/docs/es/docs/tutorial/sql-databases.md b/docs/es/docs/tutorial/sql-databases.md
index 7131716ee8..3bb3209b21 100644
--- a/docs/es/docs/tutorial/sql-databases.md
+++ b/docs/es/docs/tutorial/sql-databases.md
@@ -65,7 +65,7 @@ Hay algunas diferencias:
* `Field(primary_key=True)` le dice a SQLModel que `id` es la **clave primaria** en la base de datos SQL (puedes aprender más sobre claves primarias de SQL en la documentación de SQLModel).
- Nota: Usamos `int | None` para el campo de clave primaria para que en el código Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generará al guardar*. SQLModel entiende que la base de datos proporcionará el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentación de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para más detalles.
+ **Nota:** Usamos `int | None` para el campo de clave primaria para que en el código Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generará al guardar*. SQLModel entiende que la base de datos proporcionará el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentación de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para más detalles.
* `Field(index=True)` le dice a SQLModel que debe crear un **índice SQL** para esta columna, lo que permitirá búsquedas más rápidas en la base de datos cuando se lean datos filtrados por esta columna.
@@ -181,7 +181,7 @@ Arreglaremos estas cosas añadiendo unos **modelos extra**. Aquí es donde SQLMo
En **SQLModel**, cualquier clase de modelo que tenga `table=True` es un **modelo de tabla**.
-Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de características extra pequeñas). 🤓
+Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de pequeñas funcionalidades extra). 🤓
Con SQLModel, podemos usar **herencia** para **evitar duplicar** todos los campos en todos los casos.
@@ -296,7 +296,7 @@ Ahora usamos `response_model=HeroPublic` en lugar de la **anotación de tipo de
Si hubiéramos declarado `-> HeroPublic`, tu editor y linter se quejarían (con razón) de que estás devolviendo un `Hero` en lugar de un `HeroPublic`.
-Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipo y la ayuda de tu editor y otras herramientas.
+Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipos y la ayuda de tu editor y otras herramientas.
///
diff --git a/docs/es/docs/tutorial/static-files.md b/docs/es/docs/tutorial/static-files.md
index b99ed5f9c4..177be63027 100644
--- a/docs/es/docs/tutorial/static-files.md
+++ b/docs/es/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Puedes servir archivos estáticos automáticamente desde un directorio utilizando `StaticFiles`.
+/// tip | Consejo
+
+Si necesitas alojar un frontend, usa `app.frontend()` en su lugar, lee sobre ello en [Frontend](frontend.md).
+
+`app.frontend()` usa `StaticFiles` por debajo, con varias ventajas adicionales para frontends, como manejar el routing del lado del cliente.
+
+///
+
## Usa `StaticFiles` { #use-staticfiles }
* Importa `StaticFiles`.
diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md
index 9612b6cba4..9c4ff69b87 100644
--- a/docs/es/docs/tutorial/testing.md
+++ b/docs/es/docs/tutorial/testing.md
@@ -28,7 +28,7 @@ Crea funciones con un nombre que comience con `test_` (esta es la convención es
Usa el objeto `TestClient` de la misma manera que con `httpx`.
-Escribe declaraciones `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`).
+Escribe statements `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`).
{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
@@ -90,7 +90,7 @@ Entonces podrías tener un archivo `test_main.py` con tus pruebas. Podría estar
│ └── test_main.py
```
-Debido a que este archivo está en el mismo paquete, puedes usar importaciones relativas para importar el objeto `app` desde el módulo `main` (`main.py`):
+Debido a que este archivo está en el mismo paquete, puedes usar imports relativos para importar el objeto `app` desde el módulo `main` (`main.py`):
{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
diff --git a/docs/es/docs/virtual-environments.md b/docs/es/docs/virtual-environments.md
index 1679fd02bf..92cb83ba26 100644
--- a/docs/es/docs/virtual-environments.md
+++ b/docs/es/docs/virtual-environments.md
@@ -288,8 +288,8 @@ $ echo "*" > .venv/.gitignore
/// details | Qué significa ese comando
-* `echo "*"`: "imprimirá" el texto `*` en el terminal (la siguiente parte cambia eso un poco)
-* `>`: cualquier cosa impresa en el terminal por el comando a la izquierda de `>` no debería imprimirse, sino escribirse en el archivo que va a la derecha de `>`
+* `echo "*"`: "imprimirá" el texto `*` en la terminal (la siguiente parte cambia eso un poco)
+* `>`: cualquier cosa impresa en la terminal por el comando a la izquierda de `>` no debería imprimirse, sino escribirse en el archivo que va a la derecha de `>`
* `.gitignore`: el nombre del archivo donde debería escribirse el texto
Y `*` para Git significa "todo". Así que, ignorará todo en el directorio `.venv`.
@@ -443,6 +443,8 @@ De esta manera, cuando ejecutes `python` no intentará ejecutarse desde ese ento
Ahora estás listo para empezar a trabajar en tu proyecto.
+
+
/// tip | Consejo
¿Quieres entender todo lo anterior?
@@ -694,7 +696,7 @@ Eso significa que el sistema ahora comenzará a buscar primero los programas en:
antes de buscar en los otros directorios.
-Así que, cuando escribas `python` en el terminal, el sistema encontrará el programa Python en
+Así que, cuando escribas `python` en la terminal, el sistema encontrará el programa Python en
```plaintext
/home/user/code/awesome-project/.venv/bin/python
@@ -718,7 +720,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts
antes de buscar en los otros directorios.
-Así que, cuando escribas `python` en el terminal, el sistema encontrará el programa Python en
+Así que, cuando escribas `python` en la terminal, el sistema encontrará el programa Python en
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts\python
@@ -800,7 +802,7 @@ $ cd ~/code/prisoner-of-azkaban
-Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en el terminal, intentará usar el Python de `philosophers-stone`.
+Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en la terminal, intentará usar el Python de `philosophers-stone`.