@@ -123,4 +123,4 @@ Y porque estás usando `StaticFiles`, ese archivo CSS sería servido automática
## Más detalles { #more-details }
-Para más detalles, incluyendo cómo testear plantillas, revisa
.
+Para más detalles, incluyendo cómo testear plantillas, revisa [la documentación de Starlette sobre plantillas](https://www.starlette.dev/templates/).
diff --git a/docs/es/docs/advanced/testing-websockets.md b/docs/es/docs/advanced/testing-websockets.md
index 89ef2d5a4b..4736031633 100644
--- a/docs/es/docs/advanced/testing-websockets.md
+++ b/docs/es/docs/advanced/testing-websockets.md
@@ -8,6 +8,6 @@ Para esto, usas el `TestClient` en un statement `with`, conectándote al WebSock
/// note | Nota
-Para más detalles, revisa la documentación de Starlette sobre
.
+Para más detalles, revisa la documentación de Starlette sobre [probar WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions).
///
diff --git a/docs/es/docs/advanced/using-request-directly.md b/docs/es/docs/advanced/using-request-directly.md
index 4a063d2970..3aed8e5a36 100644
--- a/docs/es/docs/advanced/using-request-directly.md
+++ b/docs/es/docs/advanced/using-request-directly.md
@@ -15,7 +15,7 @@ Pero hay situaciones donde podrías necesitar acceder al objeto `Request` direct
## Detalles sobre el objeto `Request` { #details-about-the-request-object }
-Como **FastAPI** es en realidad **Starlette** por debajo, con una capa de varias herramientas encima, puedes usar el objeto
de Starlette directamente cuando lo necesites.
+Como **FastAPI** es en realidad **Starlette** por debajo, con una capa de varias herramientas encima, puedes usar el objeto de Starlette [`Request`](https://www.starlette.dev/requests/) directamente cuando lo necesites.
También significa que si obtienes datos del objeto `Request` directamente (por ejemplo, leyendo el cuerpo) no serán validados, convertidos o documentados (con OpenAPI, para la interfaz automática de usuario de la API) por FastAPI.
@@ -45,7 +45,7 @@ De la misma manera, puedes declarar cualquier otro parámetro como normalmente,
## Documentación de `Request` { #request-documentation }
-Puedes leer más detalles sobre el
.
+Puedes leer más detalles sobre el [objeto `Request` en el sitio de documentación oficial de Starlette](https://www.starlette.dev/requests/).
/// note | Detalles Técnicos
diff --git a/docs/es/docs/advanced/websockets.md b/docs/es/docs/advanced/websockets.md
index e9391c36ca..fe75e644b8 100644
--- a/docs/es/docs/advanced/websockets.md
+++ b/docs/es/docs/advanced/websockets.md
@@ -1,10 +1,10 @@
# WebSockets { #websockets }
-Puedes usar
con **FastAPI**.
+Puedes usar [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) con **FastAPI**.
## Instalar `websockets` { #install-websockets }
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo e instalar `websockets` (un paquete de Python que facilita usar el protocolo "WebSocket"):
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo e instalar `websockets` (un paquete de Python que facilita usar el protocolo "WebSocket"):
@@ -64,19 +64,19 @@ Puedes recibir y enviar datos binarios, de texto y JSON.
## Pruébalo { #try-it }
-Si tu archivo se llama `main.py`, ejecuta tu aplicación con:
+Pon tu código en un archivo `main.py` y luego ejecuta tu aplicación:
```console
-$ fastapi dev main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
-Abre tu navegador en
http://127.0.0.1:8000.
+Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000).
Verás una página simple como:
@@ -115,25 +115,25 @@ Funcionan de la misma manera que para otros endpoints de FastAPI/*path operation
Como esto es un WebSocket no tiene mucho sentido lanzar un `HTTPException`, en su lugar lanzamos un `WebSocketException`.
-Puedes usar un código de cierre de los
códigos válidos definidos en la especificación.
+Puedes usar un código de cierre de los [códigos válidos definidos en la especificación](https://tools.ietf.org/html/rfc6455#section-7.4.1).
///
### Prueba los WebSockets con dependencias { #try-the-websockets-with-dependencies }
-Si tu archivo se llama `main.py`, ejecuta tu aplicación con:
+Ejecuta tu aplicación:
```console
-$ fastapi dev main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
-Abre tu navegador en
http://127.0.0.1:8000.
+Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000).
Ahí puedes establecer:
@@ -174,7 +174,7 @@ La aplicación anterior es un ejemplo mínimo y simple para demostrar cómo mane
Pero ten en cuenta que, como todo se maneja en memoria, en una sola lista, solo funcionará mientras el proceso esté en ejecución, y solo funcionará con un solo proceso.
-Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, soportado por Redis, PostgreSQL u otros, revisa
encode/broadcaster.
+Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, soportado por Redis, PostgreSQL u otros, revisa [encode/broadcaster](https://github.com/encode/broadcaster).
///
@@ -182,5 +182,5 @@ Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, sopo
Para aprender más sobre las opciones, revisa la documentación de Starlette para:
-*
La clase `WebSocket`.
-*
Manejo de WebSocket basado en clases.
+* [La clase `WebSocket`](https://www.starlette.dev/websockets/).
+* [Manejo de WebSocket basado en clases](https://www.starlette.dev/endpoints/#websocketendpoint).
diff --git a/docs/es/docs/advanced/wsgi.md b/docs/es/docs/advanced/wsgi.md
index 05322a4d1e..0d0c42fd54 100644
--- a/docs/es/docs/advanced/wsgi.md
+++ b/docs/es/docs/advanced/wsgi.md
@@ -1,6 +1,6 @@
# Incluyendo WSGI - Flask, Django, otros { #including-wsgi-flask-django-others }
-Puedes montar aplicaciones WSGI como viste con [Sub Aplicaciones - Mounts](sub-applications.md){.internal-link target=_blank}, [Detrás de un Proxy](behind-a-proxy.md){.internal-link target=_blank}.
+Puedes montar aplicaciones WSGI como viste con [Sub Aplicaciones - Mounts](sub-applications.md), [Detrás de un Proxy](behind-a-proxy.md).
Para eso, puedes usar el `WSGIMiddleware` y usarlo para envolver tu aplicación WSGI, por ejemplo, Flask, Django, etc.
@@ -36,13 +36,13 @@ Ahora, cada request bajo el path `/v1/` será manejado por la aplicación Flask.
Y el resto será manejado por **FastAPI**.
-Si lo ejecutas y vas a
http://localhost:8000/v1/ verás el response de Flask:
+Si lo ejecutas y vas a [http://localhost:8000/v1/](http://localhost:8000/v1/) verás el response de Flask:
```txt
Hello, World from Flask!
```
-Y si vas a
http://localhost:8000/v2 verás el response de FastAPI:
+Y si vas a [http://localhost:8000/v2](http://localhost:8000/v2) verás el response de FastAPI:
```JSON
{
diff --git a/docs/es/docs/alternatives.md b/docs/es/docs/alternatives.md
index cc9309dd2f..4250f0a02b 100644
--- a/docs/es/docs/alternatives.md
+++ b/docs/es/docs/alternatives.md
@@ -14,7 +14,7 @@ Pero en algún punto, no hubo otra opción que crear algo que proporcionara toda
## Herramientas previas { #previous-tools }
-###
Django { #django }
+### [Django](https://www.djangoproject.com/) { #django }
Es el framework más popular de Python y es ampliamente confiable. Se utiliza para construir sistemas como Instagram.
@@ -22,7 +22,7 @@ Está relativamente acoplado con bases de datos relacionales (como MySQL o Postg
Fue creado para generar el HTML en el backend, no para crear APIs utilizadas por un frontend moderno (como React, Vue.js y Angular) o por otros sistemas (como dispositivos del
IoT) comunicándose con él.
-###
Django REST Framework { #django-rest-framework }
+### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
El framework Django REST fue creado para ser un kit de herramientas flexible para construir APIs Web utilizando Django, mejorando sus capacidades API.
@@ -42,7 +42,7 @@ Tener una interfaz de usuario web de documentación automática de APIs.
///
-###
Flask { #flask }
+### [Flask](https://flask.palletsprojects.com) { #flask }
Flask es un "microframework", no incluye integraciones de bases de datos ni muchas de las cosas que vienen por defecto en Django.
@@ -64,7 +64,7 @@ Tener un sistema de routing simple y fácil de usar.
///
-###
Requests { #requests }
+### [Requests](https://requests.readthedocs.io) { #requests }
**FastAPI** no es en realidad una alternativa a **Requests**. Su ámbito es muy diferente.
@@ -106,7 +106,7 @@ Mira las similitudes entre `requests.get(...)` y `@app.get(...)`.
///
-###
Swagger /
OpenAPI { #swagger-openapi }
+### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
La principal funcionalidad que quería de Django REST Framework era la documentación automática de la API.
@@ -124,8 +124,8 @@ Adoptar y usar un estándar abierto para especificaciones de API, en lugar de us
Y a integrar herramientas de interfaz de usuario basadas en estándares:
-*
Swagger UI
-*
ReDoc
+* [Swagger UI](https://github.com/swagger-api/swagger-ui)
+* [ReDoc](https://github.com/Rebilly/ReDoc)
Estas dos fueron elegidas por ser bastante populares y estables, pero haciendo una búsqueda rápida, podrías encontrar docenas de interfaces de usuario alternativas para OpenAPI (que puedes usar con **FastAPI**).
@@ -135,7 +135,7 @@ Estas dos fueron elegidas por ser bastante populares y estables, pero haciendo u
Existen varios frameworks REST para Flask, pero después de invertir tiempo y trabajo investigándolos, encontré que muchos son descontinuados o abandonados, con varios problemas existentes que los hacían inadecuados.
-###
Marshmallow { #marshmallow }
+### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
Una de las principales funcionalidades necesitadas por los sistemas API es la "
serialización" de datos, que consiste en tomar datos del código (Python) y convertirlos en algo que pueda ser enviado a través de la red. Por ejemplo, convertir un objeto que contiene datos de una base de datos en un objeto JSON. Convertir objetos `datetime` en strings, etc.
@@ -153,7 +153,7 @@ Usar código para definir "esquemas" que proporcionen tipos de datos y validaci
///
-###
Webargs { #webargs }
+### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs }
Otra gran funcionalidad requerida por las APIs es el
parsing de datos de las requests entrantes.
@@ -175,7 +175,7 @@ Tener validación automática de datos entrantes en una request.
///
-###
APISpec { #apispec }
+### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec }
Marshmallow y Webargs proporcionan validación, parsing y serialización como plug-ins.
@@ -205,7 +205,7 @@ Soportar el estándar abierto para APIs, OpenAPI.
///
-###
Flask-apispec { #flask-apispec }
+### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec }
Es un plug-in de Flask, que conecta juntos Webargs, Marshmallow y APISpec.
@@ -219,11 +219,11 @@ Esta combinación de Flask, Flask-apispec con Marshmallow y Webargs fue mi stack
Usarlo llevó a la creación de varios generadores de full-stack para Flask. Estos son los principales stacks que yo (y varios equipos externos) hemos estado usando hasta ahora:
-*
https://github.com/tiangolo/full-stack
-*
https://github.com/tiangolo/full-stack-flask-couchbase
-*
https://github.com/tiangolo/full-stack-flask-couchdb
+* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack)
+* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
+* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
-Y estos mismos generadores de full-stack fueron la base de los [Generadores de Proyectos **FastAPI**](project-generation.md){.internal-link target=_blank}.
+Y estos mismos generadores de full-stack fueron la base de los [Generadores de Proyectos **FastAPI**](project-generation.md).
/// info | Información
@@ -237,7 +237,7 @@ Generar el esquema OpenAPI automáticamente, desde el mismo código que define l
///
-###
NestJS (y
Angular) { #nestjs-and-angular }
+### [NestJS](https://nestjs.com/) (y [Angular](https://angular.io/)) { #nestjs-and-angular }
Esto ni siquiera es Python, NestJS es un framework de JavaScript (TypeScript) NodeJS inspirado por Angular.
@@ -259,13 +259,13 @@ Tener un poderoso sistema de inyección de dependencias. Encontrar una forma de
///
-###
Sanic { #sanic }
+### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic }
Fue uno de los primeros frameworks de Python extremadamente rápidos basados en `asyncio`. Fue hecho para ser muy similar a Flask.
/// note | Detalles Técnicos
-Usó
`uvloop` en lugar del loop `asyncio` por defecto de Python. Eso fue lo que lo hizo tan rápido.
+Usó [`uvloop`](https://github.com/MagicStack/uvloop) en lugar del loop `asyncio` por defecto de Python. Eso fue lo que lo hizo tan rápido.
Claramente inspiró a Uvicorn y Starlette, que actualmente son más rápidos que Sanic en benchmarks abiertos.
@@ -279,7 +279,7 @@ Por eso **FastAPI** se basa en Starlette, ya que es el framework más rápido di
///
-###
Falcon { #falcon }
+### [Falcon](https://falconframework.org/) { #falcon }
Falcon es otro framework de Python de alto rendimiento, está diseñado para ser minimalista y funcionar como la base de otros frameworks como Hug.
@@ -297,7 +297,7 @@ Aunque en FastAPI es opcional, y se utiliza principalmente para configurar heade
///
-###
Molten { #molten }
+### [Molten](https://moltenframework.com/) { #molten }
Descubrí Molten en las primeras etapas de construcción de **FastAPI**. Y tiene ideas bastante similares:
@@ -321,7 +321,7 @@ Esto en realidad inspiró la actualización de partes de Pydantic, para soportar
///
-###
Hug { #hug }
+### [Hug](https://github.com/hugapi/hug) { #hug }
Hug fue uno de los primeros frameworks en implementar la declaración de tipos de parámetros API usando las anotaciones de tipos de Python. Esta fue una gran idea que inspiró a otras herramientas a hacer lo mismo.
@@ -337,7 +337,7 @@ Dado que se basa en el estándar previo para frameworks web Python sincrónicos
/// info | Información
-Hug fue creado por Timothy Crosley, el mismo creador de
`isort`, una gran herramienta para ordenar automáticamente imports en archivos Python.
+Hug fue creado por Timothy Crosley, el mismo creador de [`isort`](https://github.com/timothycrosley/isort), una gran herramienta para ordenar automáticamente imports en archivos Python.
///
@@ -351,7 +351,7 @@ Hug inspiró a **FastAPI** a declarar un parámetro `response` en funciones para
///
-###
APIStar (<= 0.5) { #apistar-0-5 }
+### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
Justo antes de decidir construir **FastAPI** encontré **APIStar** server. Tenía casi todo lo que estaba buscando y tenía un gran diseño.
@@ -401,7 +401,7 @@ Considero a **FastAPI** un "sucesor espiritual" de APIStar, mientras mejora y au
## Usado por **FastAPI** { #used-by-fastapi }
-###
Pydantic { #pydantic }
+### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
Pydantic es un paquete para definir validación de datos, serialización y documentación (usando JSON Schema) basándose en las anotaciones de tipos de Python.
@@ -417,7 +417,7 @@ Manejar toda la validación de datos, serialización de datos y documentación a
///
-###
Starlette { #starlette }
+### [Starlette](https://www.starlette.dev/) { #starlette }
Starlette es un framework/toolkit
ASGI liviano, ideal para construir servicios asyncio de alto rendimiento.
@@ -433,7 +433,7 @@ Tiene:
* CORS, GZip, Archivos estáticos, Responses en streaming.
* Soporte para sesiones y cookies.
* Cobertura de tests del 100%.
-* Base de código 100% tipada.
+* code base 100% tipada.
* Pocas dependencias obligatorias.
Starlette es actualmente el framework de Python más rápido probado. Solo superado por Uvicorn, que no es un framework, sino un servidor.
@@ -462,7 +462,7 @@ Por lo tanto, cualquier cosa que puedas hacer con Starlette, puedes hacerlo dire
///
-###
Uvicorn { #uvicorn }
+### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
Uvicorn es un servidor ASGI extremadamente rápido, construido sobre uvloop y httptools.
@@ -476,10 +476,10 @@ El servidor web principal para ejecutar aplicaciones **FastAPI**.
También puedes usar la opción de línea de comandos `--workers` para tener un servidor multiproceso asíncrono.
-Revisa más detalles en la sección [Despliegue](deployment/index.md){.internal-link target=_blank}.
+Revisa más detalles en la sección [Despliegue](deployment/index.md).
///
## Benchmarks y velocidad { #benchmarks-and-speed }
-Para entender, comparar, y ver la diferencia entre Uvicorn, Starlette y FastAPI, revisa la sección sobre [Benchmarks](benchmarks.md){.internal-link target=_blank}.
+Para entender, comparar, y ver la diferencia entre Uvicorn, Starlette y FastAPI, revisa la sección sobre [Benchmarks](benchmarks.md).
diff --git a/docs/es/docs/async.md b/docs/es/docs/async.md
index a06d3e979d..a8ed00df12 100644
--- a/docs/es/docs/async.md
+++ b/docs/es/docs/async.md
@@ -141,7 +141,7 @@ Tú y tu crush comen las hamburguesas y pasan un buen rato. ✨
/// info | Información
-Hermosas ilustraciones de
Ketrina Thompson. 🎨
+Hermosas ilustraciones de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
@@ -207,7 +207,7 @@ No hubo mucho hablar o coquetear ya que la mayor parte del tiempo se dedicó a e
/// info | Información
-Hermosas ilustraciones de
Ketrina Thompson. 🎨
+Hermosas ilustraciones de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
@@ -251,7 +251,7 @@ Este tipo de asincronía es lo que hizo popular a NodeJS (aunque NodeJS no es pa
Y ese es el mismo nivel de rendimiento que obtienes con **FastAPI**.
-Y como puedes tener paralelismo y asincronía al mismo tiempo, obtienes un mayor rendimiento que la mayoría de los frameworks de NodeJS probados y a la par con Go, que es un lenguaje compilado más cercano a C
(todo gracias a Starlette).
+Y como puedes tener paralelismo y asincronía al mismo tiempo, obtienes un mayor rendimiento que la mayoría de los frameworks de NodeJS probados y a la par con Go, que es un lenguaje compilado más cercano a C [(todo gracias a Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
### ¿Es la concurrencia mejor que el paralelismo? { #is-concurrency-better-than-parallelism }
@@ -298,7 +298,7 @@ Pero también puedes explotar los beneficios del paralelismo y la multiprocesami
Eso, más el simple hecho de que Python es el lenguaje principal para **Data Science**, Machine Learning y especialmente Deep Learning, hacen de FastAPI una muy buena opción para APIs web de Data Science / Machine Learning y aplicaciones (entre muchas otras).
-Para ver cómo lograr este paralelismo en producción, consulta la sección sobre [Deployment](deployment/index.md){.internal-link target=_blank}.
+Para ver cómo lograr este paralelismo en producción, consulta la sección sobre [Despliegue](deployment/index.md).
## `async` y `await` { #async-and-await }
@@ -363,13 +363,13 @@ Pero si deseas usar `async` / `await` sin FastAPI, también puedes hacerlo.
### Escribe tu propio código async { #write-your-own-async-code }
-Starlette (y **FastAPI**) están basados en
AnyIO, lo que lo hace compatible tanto con el
asyncio del paquete estándar de Python como con
Trio.
+Starlette (y **FastAPI**) están basados en [AnyIO](https://anyio.readthedocs.io/en/stable/), lo que lo hace compatible tanto con el [asyncio](https://docs.python.org/3/library/asyncio-task.html) del paquete estándar de Python como con [Trio](https://trio.readthedocs.io/en/stable/).
-En particular, puedes usar directamente
AnyIO para tus casos de uso avanzados de concurrencia que requieran patrones más avanzados en tu propio código.
+En particular, puedes usar directamente [AnyIO](https://anyio.readthedocs.io/en/stable/) para tus casos de uso avanzados de concurrencia que requieran patrones más avanzados en tu propio código.
-E incluso si no estuvieras usando FastAPI, también podrías escribir tus propias aplicaciones asíncronas con
AnyIO para ser altamente compatibles y obtener sus beneficios (p.ej. *concurrencia estructurada*).
+E incluso si no estuvieras usando FastAPI, también podrías escribir tus propias aplicaciones asíncronas con [AnyIO](https://anyio.readthedocs.io/en/stable/) para ser altamente compatibles y obtener sus beneficios (p.ej. *concurrencia estructurada*).
-Creé otro paquete sobre AnyIO, como una capa delgada, para mejorar un poco las anotaciones de tipos y obtener mejor **autocompletado**, **errores en línea**, etc. También tiene una introducción amigable y tutorial para ayudarte a **entender** y escribir **tu propio código async**:
Asyncer. Sería particularmente útil si necesitas **combinar código async con regular** (bloqueante/sincrónico).
+Creé otro paquete sobre AnyIO, como una capa delgada, para mejorar un poco las anotaciones de tipos y obtener mejor **autocompletado**, **errores en línea**, etc. También tiene una introducción amigable y tutorial para ayudarte a **entender** y escribir **tu propio código async**: [Asyncer](https://asyncer.tiangolo.com/). Sería particularmente útil si necesitas **combinar código async con regular** (bloqueante/sincrónico).
### Otras formas de código asíncrono { #other-forms-of-asynchronous-code }
@@ -381,7 +381,7 @@ Esta misma sintaxis (o casi idéntica) también se incluyó recientemente en las
Pero antes de eso, manejar el código asíncrono era mucho más complejo y difícil.
-En versiones previas de Python, podrías haber usado hilos o
Gevent. Pero el código es mucho más complejo de entender, depurar y razonar.
+En versiones previas de Python, podrías haber usado hilos o [Gevent](https://www.gevent.org/). Pero el código es mucho más complejo de entender, depurar y razonar.
En versiones previas de NodeJS / JavaScript en el Navegador, habrías usado "callbacks". Lo que lleva al "callback hell".
@@ -407,7 +407,7 @@ Todo eso es lo que impulsa FastAPI (a través de Starlette) y lo que hace que te
Probablemente puedas saltarte esto.
-Estos son detalles muy técnicos de cómo funciona **FastAPI** en su interior.
+Estos son detalles muy técnicos de cómo **FastAPI** funciona en su interior.
Si tienes bastante conocimiento técnico (coroutines, hilos, bloqueo, etc.) y tienes curiosidad sobre cómo FastAPI maneja `async def` vs `def` normal, adelante.
@@ -419,15 +419,15 @@ Cuando declaras una *path operation function* con `def` normal en lugar de `asyn
Si vienes de otro framework async que no funciona de la manera descrita anteriormente y estás acostumbrado a definir funciones de *path operation* solo de cómputo trivial con `def` normal para una pequeña ganancia de rendimiento (alrededor de 100 nanosegundos), ten en cuenta que en **FastAPI** el efecto sería bastante opuesto. En estos casos, es mejor usar `async def` a menos que tus *path operation functions* usen código que realice
I/O de bloqueo.
-Aun así, en ambas situaciones, es probable que **FastAPI** [siga siendo más rápida](index.md#performance){.internal-link target=_blank} que (o al menos comparable a) tu framework anterior.
+Aun así, en ambas situaciones, es probable que **FastAPI** [siga siendo más rápida](index.md#performance) que (o al menos comparable a) tu framework anterior.
### Dependencias { #dependencies }
-Lo mismo aplica para las [dependencias](tutorial/dependencies/index.md){.internal-link target=_blank}. Si una dependencia es una función estándar `def` en lugar de `async def`, se ejecuta en el threadpool externo.
+Lo mismo aplica para las [dependencias](tutorial/dependencies/index.md). Si una dependencia es una función estándar `def` en lugar de `async def`, se ejecuta en el threadpool externo.
### Sub-dependencias { #sub-dependencies }
-Puedes tener múltiples dependencias y [sub-dependencias](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requiriéndose mutuamente (como parámetros de las definiciones de funciones), algunas de ellas podrían ser creadas con `async def` y algunas con `def` normal. Aun funcionará, y las que fueron creadas con `def` normal serían llamadas en un hilo externo (del threadpool) en lugar de ser "awaited".
+Puedes tener múltiples dependencias y [sub-dependencias](tutorial/dependencies/sub-dependencies.md) requiriéndose mutuamente (como parámetros de las definiciones de funciones), algunas de ellas podrían ser creadas con `async def` y algunas con `def` normal. Aun funcionará, y las que fueron creadas con `def` normal serían llamadas en un hilo externo (del threadpool) en lugar de ser "awaited".
### Otras funciones de utilidad { #other-utility-functions }
diff --git a/docs/es/docs/benchmarks.md b/docs/es/docs/benchmarks.md
index e6f8f99647..040dc58129 100644
--- a/docs/es/docs/benchmarks.md
+++ b/docs/es/docs/benchmarks.md
@@ -1,6 +1,6 @@
# Benchmarks { #benchmarks }
-Los benchmarks independientes de TechEmpower muestran aplicaciones de **FastAPI** ejecutándose bajo Uvicorn como
uno de los frameworks de Python más rápidos disponibles, solo por debajo de Starlette y Uvicorn en sí mismos (utilizados internamente por FastAPI).
+Los benchmarks independientes de TechEmpower muestran aplicaciones de **FastAPI** ejecutándose bajo Uvicorn como [uno de los frameworks de Python más rápidos disponibles](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), solo por debajo de Starlette y Uvicorn en sí mismos (utilizados internamente por FastAPI).
Pero al revisar benchmarks y comparaciones, debes tener en cuenta lo siguiente.
diff --git a/docs/es/docs/deployment/cloud.md b/docs/es/docs/deployment/cloud.md
index a3531b97a7..266d3cfd23 100644
--- a/docs/es/docs/deployment/cloud.md
+++ b/docs/es/docs/deployment/cloud.md
@@ -6,7 +6,7 @@ En la mayoría de los casos, los principales proveedores de nube tienen guías p
## FastAPI Cloud { #fastapi-cloud }
-**
FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**.
+**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**.
Simplifica el proceso de **construir**, **desplegar** y **acceder** a una API con un esfuerzo mínimo.
@@ -16,9 +16,9 @@ FastAPI Cloud es el sponsor principal y proveedor de financiamiento de los proye
## Proveedores de Nube - Sponsors { #cloud-providers-sponsors }
-Otros proveedores de nube ✨ [**son sponsors de FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ también. 🙇
+Otros proveedores de nube ✨ [**son sponsors de FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ también. 🙇
También podrías considerarlos para seguir sus guías y probar sus servicios:
-*
Render
-*
Railway
+* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi)
+* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi)
diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md
index 2ec7af19ba..9b3ac0a340 100644
--- a/docs/es/docs/deployment/concepts.md
+++ b/docs/es/docs/deployment/concepts.md
@@ -25,7 +25,7 @@ Pero por ahora, revisemos estas importantes **ideas conceptuales**. Estos concep
## Seguridad - HTTPS { #security-https }
-En el [capítulo anterior sobre HTTPS](https.md){.internal-link target=_blank} aprendimos sobre cómo HTTPS proporciona cifrado para tu API.
+En el [capítulo anterior sobre HTTPS](https.md) aprendimos sobre cómo HTTPS proporciona cifrado para tu API.
También vimos que HTTPS es normalmente proporcionado por un componente **externo** a tu servidor de aplicaciones, un **Proxy de Terminación TLS**.
@@ -190,7 +190,7 @@ Cuando ejecutas **múltiples procesos** del mismo programa de API, comúnmente s
### Worker Processes y Puertos { #worker-processes-and-ports }
-Recuerda de la documentación [Sobre HTTPS](https.md){.internal-link target=_blank} que solo un proceso puede estar escuchando en una combinación de puerto y dirección IP en un servidor.
+Recuerda de la documentación [Sobre HTTPS](https.md) que solo un proceso puede estar escuchando en una combinación de puerto y dirección IP en un servidor.
Esto sigue siendo cierto.
@@ -243,7 +243,7 @@ Aquí hay algunas combinaciones y estrategias posibles:
No te preocupes si algunos de estos elementos sobre **contenedores**, Docker, o Kubernetes no tienen mucho sentido todavía.
-Te contaré más sobre imágenes de contenedores, Docker, Kubernetes, etc. en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}.
+Te contaré más sobre imágenes de contenedores, Docker, Kubernetes, etc. en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md).
///
@@ -281,7 +281,7 @@ Aquí hay algunas ideas posibles:
/// tip | Consejo
-Te daré más ejemplos concretos para hacer esto con contenedores en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}.
+Te daré más ejemplos concretos para hacer esto con contenedores en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md).
///
diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md
index 105a5902b7..6ce0e192ac 100644
--- a/docs/es/docs/deployment/docker.md
+++ b/docs/es/docs/deployment/docker.md
@@ -1,6 +1,6 @@
# FastAPI en Contenedores - Docker { #fastapi-in-containers-docker }
-Al desplegar aplicaciones de FastAPI, un enfoque común es construir una **imagen de contenedor de Linux**. Normalmente se realiza usando
**Docker**. Luego puedes desplegar esa imagen de contenedor de varias formas.
+Al desplegar aplicaciones de FastAPI, un enfoque común es construir una **imagen de contenedor de Linux**. Normalmente se realiza usando [**Docker**](https://www.docker.com/). Luego puedes desplegar esa imagen de contenedor de varias formas.
Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **replicabilidad**, **simplicidad**, y otras.
@@ -60,16 +60,16 @@ Y el **contenedor** en sí (en contraste con la **imagen de contenedor**) es la
Docker ha sido una de las herramientas principales para crear y gestionar **imágenes de contenedor** y **contenedores**.
-Y hay un
Docker Hub público con **imágenes de contenedores oficiales** pre-hechas para muchas herramientas, entornos, bases de datos y aplicaciones.
+Y hay un [Docker Hub](https://hub.docker.com/) público con **imágenes de contenedores oficiales** pre-hechas para muchas herramientas, entornos, bases de datos y aplicaciones.
-Por ejemplo, hay una
Imagen de Python oficial.
+Por ejemplo, hay una [Imagen de Python](https://hub.docker.com/_/python) oficial.
Y hay muchas otras imágenes para diferentes cosas como bases de datos, por ejemplo para:
-*
PostgreSQL
-*
MySQL
-*
MongoDB
-*
Redis, etc.
+* [PostgreSQL](https://hub.docker.com/_/postgres)
+* [MySQL](https://hub.docker.com/_/mysql)
+* [MongoDB](https://hub.docker.com/_/mongo)
+* [Redis](https://hub.docker.com/_/redis), etc.
Usando una imagen de contenedor pre-hecha es muy fácil **combinar** y utilizar diferentes herramientas. Por ejemplo, para probar una nueva base de datos. En la mayoría de los casos, puedes usar las **imágenes oficiales**, y simplemente configurarlas con variables de entorno.
@@ -111,7 +111,7 @@ Dependería principalmente de la herramienta que uses para **instalar** esos req
La forma más común de hacerlo es tener un archivo `requirements.txt` con los nombres de los paquetes y sus versiones, uno por línea.
-Por supuesto, usarías las mismas ideas que leíste en [Acerca de las versiones de FastAPI](versions.md){.internal-link target=_blank} para establecer los rangos de versiones.
+Por supuesto, usarías las mismas ideas que leíste en [Acerca de las versiones de FastAPI](versions.md) para establecer los rangos de versiones.
Por ejemplo, tu `requirements.txt` podría verse así:
@@ -238,7 +238,7 @@ Asegúrate de **siempre** usar la **forma exec** de la instrucción `CMD`, como
#### Usar `CMD` - Forma Exec { #use-cmd-exec-form }
-La instrucción Docker
`CMD` se puede escribir usando dos formas:
+La instrucción Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) se puede escribir usando dos formas:
✅ **Forma Exec**:
@@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
CMD fastapi run app/main.py --port 80
```
-Asegúrate de siempre usar la **forma exec** para garantizar que FastAPI pueda cerrarse de manera adecuada y que [los eventos de lifespan](../advanced/events.md){.internal-link target=_blank} sean disparados.
+Asegúrate de siempre usar la **forma exec** para garantizar que FastAPI pueda cerrarse de manera adecuada y que [los eventos de lifespan](../advanced/events.md) sean disparados.
-Puedes leer más sobre esto en las
documentación de Docker para formas de shell y exec.
+Puedes leer más sobre esto en la [documentación de Docker para formas de shell y exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form).
-Esto puede ser bastante notorio al usar `docker compose`. Consulta esta sección de preguntas frecuentes de Docker Compose para más detalles técnicos:
¿Por qué mis servicios tardan 10 segundos en recrearse o detenerse?.
+Esto puede ser bastante notorio al usar `docker compose`. Consulta esta sección de preguntas frecuentes de Docker Compose para más detalles técnicos: [¿Por qué mis servicios tardan 10 segundos en recrearse o detenerse?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
#### Estructura de Directorios { #directory-structure }
@@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
## Revísalo { #check-it }
-Deberías poder revisarlo en la URL de tu contenedor de Docker, por ejemplo:
http://192.168.99.100/items/5?q=somequery o
http://127.0.0.1/items/5?q=somequery (o equivalente, usando tu host de Docker).
+Deberías poder revisarlo en la URL de tu contenedor de Docker, por ejemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) o [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (o equivalente, usando tu host de Docker).
Verás algo como:
@@ -362,17 +362,17 @@ Verás algo como:
## Documentación Interactiva de la API { #interactive-api-docs }
-Ahora puedes ir a
http://192.168.99.100/docs o
http://127.0.0.1/docs (o equivalente, usando tu host de Docker).
+Ahora puedes ir a [http://192.168.99.100/docs](http://192.168.99.100/docs) o [http://127.0.0.1/docs](http://127.0.0.1/docs) (o equivalente, usando tu host de Docker).
-Verás la documentación interactiva automática de la API (proporcionada por
Swagger UI):
+Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)):

## Documentación Alternativa de la API { #alternative-api-docs }
-Y también puedes ir a
http://192.168.99.100/redoc o
http://127.0.0.1/redoc (o equivalente, usando tu host de Docker).
+Y también puedes ir a [http://192.168.99.100/redoc](http://192.168.99.100/redoc) o [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (o equivalente, usando tu host de Docker).
-Verás la documentación alternativa automática (proporcionada por
ReDoc):
+Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)):

@@ -413,7 +413,7 @@ Cuando pasas el archivo a `fastapi run`, detectará automáticamente que es un a
## Conceptos de Despliegue { #deployment-concepts }
-Hablemos nuevamente de algunos de los mismos [Conceptos de Despliegue](concepts.md){.internal-link target=_blank} en términos de contenedores.
+Hablemos nuevamente de algunos de los mismos [Conceptos de Despliegue](concepts.md) en términos de contenedores.
Los contenedores son principalmente una herramienta para simplificar el proceso de **construcción y despliegue** de una aplicación, pero no imponen un enfoque particular para manejar estos **conceptos de despliegue**, y hay varias estrategias posibles.
@@ -432,7 +432,7 @@ Revisemos estos **conceptos de despliegue** en términos de contenedores:
Si nos enfocamos solo en la **imagen de contenedor** para una aplicación FastAPI (y luego el **contenedor** en ejecución), HTTPS normalmente sería manejado **externamente** por otra herramienta.
-Podría ser otro contenedor, por ejemplo, con
Traefik, manejando **HTTPS** y la adquisición **automática** de **certificados**.
+Podría ser otro contenedor, por ejemplo, con [Traefik](https://traefik.io/), manejando **HTTPS** y la adquisición **automática** de **certificados**.
/// tip | Consejo
@@ -558,7 +558,7 @@ Si tienes **múltiples contenedores**, probablemente cada uno ejecutando un **pr
/// info | Información
-Si estás usando Kubernetes, probablemente sería un
Contenedor de Inicialización.
+Si estás usando Kubernetes, probablemente sería un [Contenedor de Inicialización](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
///
@@ -570,7 +570,7 @@ Si tienes una configuración simple, con un **contenedor único** que luego inic
### Imagen Base de Docker { #base-docker-image }
-Solía haber una imagen official de Docker de FastAPI:
tiangolo/uvicorn-gunicorn-fastapi. Pero ahora está obsoleta. ⛔️
+Solía haber una imagen oficial de Docker de FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Pero ahora está obsoleta. ⛔️
Probablemente **no** deberías usar esta imagen base de Docker (o cualquier otra similar).
@@ -600,7 +600,7 @@ Por ejemplo:
## Imagen de Docker con `uv` { #docker-image-with-uv }
-Si estás usando
uv para instalar y gestionar tu proyecto, puedes seguir su
guía de Docker de uv.
+Si estás usando [uv](https://github.com/astral-sh/uv) para instalar y gestionar tu proyecto, puedes seguir su [guía de Docker de uv](https://docs.astral.sh/uv/guides/integration/docker/).
## Resumen { #recap }
diff --git a/docs/es/docs/deployment/fastapicloud.md b/docs/es/docs/deployment/fastapicloud.md
index 9763af48c5..fc770d1eed 100644
--- a/docs/es/docs/deployment/fastapicloud.md
+++ b/docs/es/docs/deployment/fastapicloud.md
@@ -1,6 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Puedes desplegar tu app de FastAPI en
FastAPI Cloud con **un solo comando**; ve y únete a la lista de espera si aún no lo has hecho. 🚀
+Puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com) con **un solo comando**; ve y únete a la lista de espera si aún no lo has hecho. 🚀
## Iniciar sesión { #login }
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud...
## Acerca de FastAPI Cloud { #about-fastapi-cloud }
-**
FastAPI Cloud** está creado por el mismo autor y equipo detrás de **FastAPI**.
+**[FastAPI Cloud](https://fastapicloud.com)** está creado por el mismo autor y equipo detrás de **FastAPI**.
Agiliza el proceso de **crear**, **desplegar** y **acceder** a una API con el mínimo esfuerzo.
diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md
index d7a244107c..227aab0d6a 100644
--- a/docs/es/docs/deployment/https.md
+++ b/docs/es/docs/deployment/https.md
@@ -10,7 +10,7 @@ Si tienes prisa o no te importa, continúa con las siguientes secciones para ver
///
-Para **aprender los conceptos básicos de HTTPS**, desde una perspectiva de consumidor, revisa
https://howhttps.works/.
+Para **aprender los conceptos básicos de HTTPS**, desde una perspectiva de consumidor, revisa [https://howhttps.works/](https://howhttps.works/).
Ahora, desde una **perspectiva de desarrollador**, aquí hay varias cosas a tener en cuenta al pensar en HTTPS:
@@ -28,13 +28,13 @@ Ahora, desde una **perspectiva de desarrollador**, aquí hay varias cosas a tene
* **Por defecto**, eso significaría que solo puedes tener **un certificado HTTPS por dirección IP**.
* No importa cuán grande sea tu servidor o qué tan pequeña pueda ser cada aplicación que tengas en él.
* Sin embargo, hay una **solución** para esto.
-* Hay una **extensión** para el protocolo **TLS** (el que maneja la encriptación a nivel de TCP, antes de HTTP) llamada **
SNI**.
+* Hay una **extensión** para el protocolo **TLS** (el que maneja la encriptación a nivel de TCP, antes de HTTP) llamada **[
SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**.
* Esta extensión SNI permite que un solo servidor (con una **sola dirección IP**) tenga **varios certificados HTTPS** y sirva **múltiples dominios/aplicaciones HTTPS**.
* Para que esto funcione, un componente (programa) **único** que se ejecute en el servidor, escuchando en la **dirección IP pública**, debe tener **todos los certificados HTTPS** en el servidor.
* **Después** de obtener una conexión segura, el protocolo de comunicación sigue siendo **HTTP**.
* Los contenidos están **encriptados**, aunque se envién con el **protocolo HTTP**.
-Es una práctica común tener **un programa/servidor HTTP** ejecutándose en el servidor (la máquina, host, etc.) y **gestionando todas las partes de HTTPS**: recibiendo los **requests HTTPS encriptados**, enviando los **requests HTTP desencriptados** a la aplicación HTTP real que se ejecuta en el mismo servidor (la aplicación **FastAPI**, en este caso), tomando el **response HTTP** de la aplicación, **encriptándolo** usando el **certificado HTTPS** adecuado y enviándolo de vuelta al cliente usando **HTTPS**. Este servidor a menudo se llama un **
TLS Termination Proxy**.
+Es una práctica común tener **un programa/servidor HTTP** ejecutándose en el servidor (la máquina, host, etc.) y **gestionando todas las partes de HTTPS**: recibiendo los **requests HTTPS encriptados**, enviando los **requests HTTP desencriptados** a la aplicación HTTP real que se ejecuta en el mismo servidor (la aplicación **FastAPI**, en este caso), tomando el **response HTTP** de la aplicación, **encriptándolo** usando el **certificado HTTPS** adecuado y enviándolo de vuelta al cliente usando **HTTPS**. Este servidor a menudo se llama un **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**.
Algunas de las opciones que podrías usar como un TLS Termination Proxy son:
@@ -49,7 +49,7 @@ Antes de Let's Encrypt, estos **certificados HTTPS** eran vendidos por terceros.
El proceso para adquirir uno de estos certificados solía ser complicado, requerir bastante papeleo y los certificados eran bastante costosos.
-Pero luego se creó **
Let's Encrypt**.
+Pero luego se creó **[Let's Encrypt](https://letsencrypt.org/)**.
Es un proyecto de la Linux Foundation. Proporciona **certificados HTTPS de forma gratuita**, de manera automatizada. Estos certificados usan toda la seguridad criptográfica estándar, y tienen una corta duración (aproximadamente 3 meses), por lo que la **seguridad es en realidad mejor** debido a su lifespan reducida.
@@ -200,9 +200,9 @@ Este **proxy** normalmente configuraría algunos headers HTTP sobre la marcha an
Los headers del proxy son:
-*
X-Forwarded-For
-*
X-Forwarded-Proto
-*
X-Forwarded-Host
+* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For)
+* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto)
+* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host)
///
@@ -218,7 +218,7 @@ Esto sería útil, por ejemplo, para manejar correctamente redirecciones.
/// tip | Consejo
-Puedes aprender más sobre esto en la documentación de [Detrás de un proxy - Habilitar headers reenviados por el proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank}
+Puedes aprender más sobre esto en la documentación de [Detrás de un proxy - Habilitar headers reenviados por el proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers)
///
diff --git a/docs/es/docs/deployment/index.md b/docs/es/docs/deployment/index.md
index 1260c68b98..c4025deaa6 100644
--- a/docs/es/docs/deployment/index.md
+++ b/docs/es/docs/deployment/index.md
@@ -16,7 +16,7 @@ Hay varias maneras de hacerlo dependiendo de tu caso de uso específico y las he
Podrías **desplegar un servidor** tú mismo utilizando una combinación de herramientas, podrías usar un **servicio en la nube** que hace parte del trabajo por ti, u otras opciones posibles.
-Por ejemplo, nosotros, el equipo detrás de FastAPI, construimos
**FastAPI Cloud**, para hacer que desplegar aplicaciones de FastAPI en la nube sea lo más ágil posible, con la misma experiencia de desarrollador de trabajar con FastAPI.
+Por ejemplo, nosotros, el equipo detrás de FastAPI, construimos [**FastAPI Cloud**](https://fastapicloud.com), para hacer que desplegar aplicaciones de FastAPI en la nube sea lo más ágil posible, con la misma experiencia de desarrollador de trabajar con FastAPI.
Te mostraré algunos de los conceptos principales que probablemente deberías tener en cuenta al desplegar una aplicación **FastAPI** (aunque la mayoría se aplica a cualquier otro tipo de aplicación web).
diff --git a/docs/es/docs/deployment/manually.md b/docs/es/docs/deployment/manually.md
index 3c597ff69e..f3c771a515 100644
--- a/docs/es/docs/deployment/manually.md
+++ b/docs/es/docs/deployment/manually.md
@@ -52,11 +52,11 @@ Lo principal que necesitas para ejecutar una aplicación **FastAPI** (o cualquie
Hay varias alternativas, incluyendo:
-*
Uvicorn: un servidor ASGI de alto rendimiento.
-*
Hypercorn: un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades.
-*
Daphne: el servidor ASGI construido para Django Channels.
-*
Granian: Un servidor HTTP Rust para aplicaciones en Python.
-*
NGINX Unit: NGINX Unit es un runtime para aplicaciones web ligero y versátil.
+* [Uvicorn](https://www.uvicorn.dev/): un servidor ASGI de alto rendimiento.
+* [Hypercorn](https://hypercorn.readthedocs.io/): un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades.
+* [Daphne](https://github.com/django/daphne): el servidor ASGI construido para Django Channels.
+* [Granian](https://github.com/emmett-framework/granian): Un servidor HTTP Rust para aplicaciones en Python.
+* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit es un runtime para aplicaciones web ligero y versátil.
## Máquina Servidor y Programa Servidor { #server-machine-and-server-program }
@@ -74,7 +74,7 @@ Cuando instalas FastAPI, viene con un servidor de producción, Uvicorn, y puedes
Pero también puedes instalar un servidor ASGI manualmente.
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego puedes instalar la aplicación del servidor.
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo, y luego puedes instalar la aplicación del servidor.
Por ejemplo, para instalar Uvicorn:
diff --git a/docs/es/docs/deployment/server-workers.md b/docs/es/docs/deployment/server-workers.md
index 9cdd79bc0f..3e3a1898be 100644
--- a/docs/es/docs/deployment/server-workers.md
+++ b/docs/es/docs/deployment/server-workers.md
@@ -13,13 +13,13 @@ Hasta este punto, con todos los tutoriales en la documentación, probablemente h
Al desplegar aplicaciones probablemente querrás tener algo de **replicación de procesos** para aprovechar **múltiples núcleos** y poder manejar más requests.
-Como viste en el capítulo anterior sobre [Conceptos de Despliegue](concepts.md){.internal-link target=_blank}, hay múltiples estrategias que puedes usar.
+Como viste en el capítulo anterior sobre [Conceptos de Despliegue](concepts.md), hay múltiples estrategias que puedes usar.
Aquí te mostraré cómo usar **Uvicorn** con **worker processes** usando el comando `fastapi` o el comando `uvicorn` directamente.
/// info | Información
-Si estás usando contenedores, por ejemplo con Docker o Kubernetes, te contaré más sobre eso en el próximo capítulo: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}.
+Si estás usando contenedores, por ejemplo con Docker o Kubernetes, te contaré más sobre eso en el próximo capítulo: [FastAPI en Contenedores - Docker](docker.md).
En particular, cuando corras en **Kubernetes** probablemente **no** querrás usar workers y en cambio correr **un solo proceso de Uvicorn por contenedor**, pero te contaré sobre eso más adelante en ese capítulo.
@@ -126,7 +126,7 @@ De la lista de conceptos de despliegue de antes, usar workers ayudaría principa
## Contenedores y Docker { #containers-and-docker }
-En el próximo capítulo sobre [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank} te explicaré algunas estrategias que podrías usar para manejar los otros **conceptos de despliegue**.
+En el próximo capítulo sobre [FastAPI en Contenedores - Docker](docker.md) te explicaré algunas estrategias que podrías usar para manejar los otros **conceptos de despliegue**.
Te mostraré cómo **construir tu propia imagen desde cero** para ejecutar un solo proceso de Uvicorn. Es un proceso sencillo y probablemente es lo que querrías hacer al usar un sistema de gestión de contenedores distribuido como **Kubernetes**.
diff --git a/docs/es/docs/deployment/versions.md b/docs/es/docs/deployment/versions.md
index 193654b2d2..02792f1f8b 100644
--- a/docs/es/docs/deployment/versions.md
+++ b/docs/es/docs/deployment/versions.md
@@ -4,7 +4,7 @@
Se añaden nuevas funcionalidades con frecuencia, se corrigen bugs regularmente, y el código sigue mejorando continuamente.
-Por eso las versiones actuales siguen siendo `0.x.x`, esto refleja que cada versión podría tener potencialmente cambios incompatibles. Esto sigue las convenciones de
Semantic Versioning.
+Por eso las versiones actuales siguen siendo `0.x.x`, esto refleja que cada versión podría tener potencialmente cambios incompatibles. Esto sigue las convenciones de [Semantic Versioning](https://semver.org/).
Puedes crear aplicaciones de producción con **FastAPI** ahora mismo (y probablemente ya lo has estado haciendo desde hace algún tiempo), solo debes asegurarte de que utilizas una versión que funciona correctamente con el resto de tu código.
@@ -34,7 +34,7 @@ Si utilizas cualquier otra herramienta para gestionar tus instalaciones, como `u
## Versiones disponibles { #available-versions }
-Puedes ver las versiones disponibles (por ejemplo, para revisar cuál es la más reciente) en las [Release Notes](../release-notes.md){.internal-link target=_blank}.
+Puedes ver las versiones disponibles (por ejemplo, para revisar cuál es la más reciente) en las [Release Notes](../release-notes.md).
## Sobre las versiones { #about-versions }
@@ -66,7 +66,7 @@ El "MINOR" es el número en el medio, por ejemplo, en `0.2.3`, la versión MINOR
Deberías añadir tests para tu aplicación.
-Con **FastAPI** es muy fácil (gracias a Starlette), revisa la documentación: [Testing](../tutorial/testing.md){.internal-link target=_blank}
+Con **FastAPI** es muy fácil (gracias a Starlette), revisa la documentación: [Escribir pruebas](../tutorial/testing.md)
Después de tener tests, puedes actualizar la versión de **FastAPI** a una más reciente, y asegurarte de que todo tu código está funcionando correctamente ejecutando tus tests.
diff --git a/docs/es/docs/environment-variables.md b/docs/es/docs/environment-variables.md
index 1b0941a7f5..5c58771d98 100644
--- a/docs/es/docs/environment-variables.md
+++ b/docs/es/docs/environment-variables.md
@@ -65,7 +65,7 @@ print(f"Hello {name} from Python")
/// tip | Consejo
-El segundo argumento de
`os.getenv()` es el valor por defecto a retornar.
+El segundo argumento de [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) es el valor por defecto a retornar.
Si no se proporciona, es `None` por defecto; aquí proporcionamos `"World"` como el valor por defecto para usar.
@@ -153,7 +153,7 @@ Hello World from Python
/// tip | Consejo
-Puedes leer más al respecto en
The Twelve-Factor App: Config.
+Puedes leer más al respecto en [The Twelve-Factor App: Config](https://12factor.net/config).
///
@@ -163,7 +163,7 @@ Estas variables de entorno solo pueden manejar **strings de texto**, ya que son
Esto significa que **cualquier valor** leído en Python desde una variable de entorno **será un `str`**, y cualquier conversión a un tipo diferente o cualquier validación tiene que hacerse en el código.
-Aprenderás más sobre cómo usar variables de entorno para manejar **configuraciones de aplicación** en la [Guía del Usuario Avanzado - Ajustes y Variables de Entorno](./advanced/settings.md){.internal-link target=_blank}.
+Aprenderás más sobre cómo usar variables de entorno para manejar **configuraciones de aplicación** en la [Guía del Usuario Avanzado - Ajustes y Variables de Entorno](./advanced/settings.md).
## Variable de Entorno `PATH` { #path-environment-variable }
@@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python
////
-Esta información será útil al aprender sobre [Entornos Virtuales](virtual-environments.md){.internal-link target=_blank}.
+Esta información será útil al aprender sobre [Entornos Virtuales](virtual-environments.md).
## Conclusión { #conclusion }
Con esto deberías tener una comprensión básica de qué son las **variables de entorno** y cómo usarlas en Python.
-También puedes leer más sobre ellas en la
Wikipedia para Variable de Entorno.
+También puedes leer más sobre ellas en la [Wikipedia para Variable de Entorno](https://en.wikipedia.org/wiki/Environment_variable).
En muchos casos no es muy obvio cómo las variables de entorno serían útiles y aplicables de inmediato. Pero siguen apareciendo en muchos escenarios diferentes cuando estás desarrollando, así que es bueno conocerlas.
diff --git a/docs/es/docs/fastapi-cli.md b/docs/es/docs/fastapi-cli.md
index 7866254223..e8d6ad6c80 100644
--- a/docs/es/docs/fastapi-cli.md
+++ b/docs/es/docs/fastapi-cli.md
@@ -1,15 +1,15 @@
# FastAPI CLI { #fastapi-cli }
-**FastAPI CLI** es un programa de línea de comandos que puedes usar para servir tu aplicación FastAPI, gestionar tu proyecto FastAPI, y más.
+**FastAPI
CLI** es un programa de línea de comandos que puedes usar para servir tu aplicación FastAPI, gestionar tu proyecto FastAPI, y más.
-Cuando instalas FastAPI (por ejemplo, con `pip install "fastapi[standard]"`), incluye un paquete llamado `fastapi-cli`, este paquete proporciona el comando `fastapi` en la terminal.
+Cuando instalas FastAPI (por ejemplo, con `pip install "fastapi[standard]"`), viene con un programa de línea de comandos que puedes ejecutar en la terminal.
Para ejecutar tu aplicación FastAPI en modo de desarrollo, puedes usar el comando `fastapi dev`:
```console
-$
fastapi dev
main.py
+$
fastapi dev
FastAPI Starting development server 🚀
@@ -46,13 +46,66 @@ $
fastapi dev
Uvicorn, un servidor ASGI de alto rendimiento y listo para producción. 😎
+Internamente, **FastAPI CLI** usa [Uvicorn](https://www.uvicorn.dev), un servidor ASGI de alto rendimiento y listo para producción. 😎
+
+El CLI `fastapi` intentará detectar automáticamente la app de FastAPI que debe ejecutar, asumiendo que es un objeto llamado `app` en un archivo `main.py` (o un par de variantes más).
+
+Pero puedes configurar explícitamente la app a usar.
+
+## Configura el `entrypoint` de la app en `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
+
+Puedes configurar dónde está tu app en un archivo `pyproject.toml` así:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+Ese `entrypoint` le dirá al comando `fastapi` que debe importar la app así:
+
+```python
+from main import app
+```
+
+Si tu código estuviera estructurado así:
+
+```
+.
+├── backend
+│ ├── main.py
+│ ├── __init__.py
+```
+
+Entonces establecerías el `entrypoint` como:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+lo cual sería equivalente a:
+
+```python
+from backend.main import app
+```
+
+### `fastapi dev` con path { #fastapi-dev-with-path }
+
+También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará el objeto app de FastAPI a usar:
+
+```console
+$ fastapi dev main.py
+```
+
+Pero tendrías que recordar pasar el path correcto cada vez que llames al comando `fastapi`.
+
+Adicionalmente, otras herramientas podrían no ser capaces de encontrarla, 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`.
## `fastapi dev` { #fastapi-dev }
@@ -70,6 +123,6 @@ En la mayoría de los casos tendrías (y deberías) tener un "proxy de terminaci
/// tip | Consejo
-Puedes aprender más al respecto en la [documentación de despliegue](deployment/index.md){.internal-link target=_blank}.
+Puedes aprender más al respecto en la [documentación de despliegue](deployment/index.md).
///
diff --git a/docs/es/docs/features.md b/docs/es/docs/features.md
index 947ef312db..754099c8d6 100644
--- a/docs/es/docs/features.md
+++ b/docs/es/docs/features.md
@@ -6,8 +6,8 @@
### Basado en estándares abiertos { #based-on-open-standards }
-* OpenAPI 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 (ya que OpenAPI en sí mismo está basado en JSON Schema).
+* [**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.
@@ -15,11 +15,11 @@
Interfaces web de documentación y exploración de APIs interactivas. Como el framework está basado en OpenAPI, hay múltiples opciones, 2 incluidas por defecto.
-* Swagger UI, con exploración interactiva, llama y prueba tu API directamente desde el navegador.
+* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), con exploración interactiva, llama y prueba tu API directamente desde el navegador.

-* Documentación alternativa de API con ReDoc.
+* Documentación alternativa de API con [**ReDoc**](https://github.com/Rebilly/ReDoc).

@@ -27,7 +27,7 @@ Interfaces web de documentación y exploración de APIs interactivas. Como el fr
Todo está basado en declaraciones estándar de **tipos en Python** (gracias a Pydantic). Sin nueva sintaxis que aprender. Solo Python moderno estándar.
-Si necesitas un repaso de 2 minutos sobre cómo usar tipos en Python (aunque no uses FastAPI), revisa el tutorial corto: [Tipos en Python](python-types.md){.internal-link target=_blank}.
+Si necesitas un repaso de 2 minutos sobre cómo usar tipos en Python (aunque no uses FastAPI), revisa el tutorial corto: [Tipos en Python](python-types.md).
Escribes Python estándar con tipos:
@@ -75,7 +75,7 @@ Pasa las claves y valores del dict `second_user_data` directamente como argument
Todo el framework fue diseñado para ser fácil e intuitivo de usar, todas las decisiones fueron probadas en múltiples editores incluso antes de comenzar el desarrollo, para asegurar la mejor experiencia de desarrollo.
-En las encuestas a desarrolladores de Python, es claro que una de las funcionalidades más usadas es el "autocompletado".
+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.
@@ -83,11 +83,11 @@ Rara vez necesitarás regresar a la documentación.
Aquí está cómo tu editor podría ayudarte:
-* en Visual Studio Code:
+* en [Visual Studio Code](https://code.visualstudio.com/):

-* en PyCharm:
+* en [PyCharm](https://www.jetbrains.com/pycharm/):

@@ -124,7 +124,7 @@ Seguridad y autenticación integradas. Sin ningún compromiso con bases de datos
Todos los esquemas de seguridad definidos en OpenAPI, incluyendo:
* HTTP Básico.
-* **OAuth2** (también con **tokens JWT**). Revisa el tutorial sobre [OAuth2 con JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
+* **OAuth2** (también con **tokens JWT**). Revisa el tutorial sobre [OAuth2 con JWT](tutorial/security/oauth2-jwt.md).
* API keys en:
* Headers.
* Parámetros de query.
@@ -159,13 +159,13 @@ Cualquier integración está diseñada para ser tan simple de usar (con dependen
## Funcionalidades de Starlette { #starlette-features }
-**FastAPI** es totalmente compatible con (y está basado en) Starlette. Así que, cualquier código adicional de Starlette que tengas, también funcionará.
+**FastAPI** es totalmente compatible con (y está basado en) [**Starlette**](https://www.starlette.dev/). Así que, cualquier código adicional de Starlette que tengas, también funcionará.
`FastAPI` es en realidad una subclase de `Starlette`. Así que, si ya conoces o usas Starlette, la mayoría de las funcionalidades funcionarán de la misma manera.
Con **FastAPI** obtienes todas las funcionalidades de **Starlette** (ya que FastAPI es simplemente Starlette potenciado):
-* Rendimiento seriamente impresionante. Es uno de los frameworks de Python más rápidos disponibles, a la par de **NodeJS** y **Go**.
+* Rendimiento seriamente impresionante. Es [uno de los frameworks de Python más rápidos disponibles, a la par de **NodeJS** y **Go**](https://github.com/encode/starlette#performance).
* Soporte para **WebSocket**.
* Tareas en segundo plano en el mismo proceso.
* Eventos de inicio y apagado.
@@ -177,7 +177,7 @@ Con **FastAPI** obtienes todas las funcionalidades de **Starlette** (ya que Fast
## Funcionalidades de Pydantic { #pydantic-features }
-**FastAPI** es totalmente compatible con (y está basado en) Pydantic. Por lo tanto, cualquier código adicional de Pydantic que tengas, también funcionará.
+**FastAPI** es totalmente compatible con (y está basado en) [**Pydantic**](https://docs.pydantic.dev/). Por lo tanto, cualquier código adicional de Pydantic que tengas, también funcionará.
Incluyendo paquetes externos también basados en Pydantic, como ORMs, ODMs para bases de datos.
diff --git a/docs/es/docs/help-fastapi.md b/docs/es/docs/help-fastapi.md
index 9b727dab08..66b00fc8b6 100644
--- a/docs/es/docs/help-fastapi.md
+++ b/docs/es/docs/help-fastapi.md
@@ -12,7 +12,7 @@ Y también hay varias formas de conseguir ayuda.
## Suscríbete al boletín { #subscribe-to-the-newsletter }
-Puedes suscribirte al (esporádico) boletín [**FastAPI and friends**](newsletter.md){.internal-link target=_blank} para mantenerte al día sobre:
+Puedes suscribirte al (esporádico) [boletín **FastAPI and friends**](newsletter.md) para mantenerte al día sobre:
* Noticias sobre FastAPI y amigos 🚀
* Guías 📝
@@ -22,17 +22,17 @@ Puedes suscribirte al (esporádico) boletín [**FastAPI and friends**](newslette
## Sigue a FastAPI en X (Twitter) { #follow-fastapi-on-x-twitter }
-Sigue a @fastapi en **X (Twitter)** para obtener las últimas noticias sobre **FastAPI**. 🐦
+[Sigue a @fastapi en **X (Twitter)**](https://x.com/fastapi) para obtener las últimas noticias sobre **FastAPI**. 🐦
## Dale una estrella a **FastAPI** en GitHub { #star-fastapi-in-github }
-Puedes "darle una estrella" a FastAPI en GitHub (haciendo clic en el botón de estrella en la parte superior derecha): https://github.com/fastapi/fastapi. ⭐️
+Puedes "darle una estrella" a FastAPI en GitHub (haciendo clic en el botón de estrella en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️
Al agregar una estrella, otros usuarios podrán encontrarlo más fácilmente y ver que ya ha sido útil para otros.
## Observa el repositorio de GitHub para lanzamientos { #watch-the-github-repository-for-releases }
-Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): https://github.com/fastapi/fastapi. 👀
+Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
Allí puedes seleccionar "Releases only".
@@ -40,45 +40,45 @@ Al hacerlo, recibirás notificaciones (en tu email) cada vez que haya un nuevo l
## Conéctate con el autor { #connect-with-the-author }
-Puedes conectar conmigo (Sebastián Ramírez / `tiangolo`), el autor.
+Puedes conectar [conmigo (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), el autor.
Puedes:
-* Seguirme en **GitHub**.
+* [Seguirme en **GitHub**](https://github.com/tiangolo).
* Ver otros proyectos de Código Abierto que he creado y que podrían ayudarte.
* Seguirme para ver cuándo creo un nuevo proyecto de Código Abierto.
-* Seguirme en **X (Twitter)** o Mastodon.
+* [Seguirme en **X (Twitter)**](https://x.com/tiangolo) o [Mastodon](https://fosstodon.org/@tiangolo).
* Contarme cómo usas FastAPI (me encanta oír eso).
* Enterarte cuando hago anuncios o lanzo nuevas herramientas.
- * También puedes seguir @fastapi en X (Twitter) (una cuenta aparte).
-* Seguirme en **LinkedIn**.
+ * También puedes [seguir @fastapi en X (Twitter)](https://x.com/fastapi) (una cuenta aparte).
+* [Seguirme en **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
* Enterarte cuando hago anuncios o lanzo nuevas herramientas (aunque uso X (Twitter) más a menudo 🤷♂).
-* Leer lo que escribo (o seguirme) en **Dev.to** o **Medium**.
+* Leer lo que escribo (o seguirme) en [**Dev.to**](https://dev.to/tiangolo) o [**Medium**](https://medium.com/@tiangolo).
* Leer otras ideas, artículos, y leer sobre las herramientas que he creado.
* Seguirme para leer lo que publico nuevo.
## Twittea sobre **FastAPI** { #tweet-about-fastapi }
-Twittea sobre **FastAPI** y dime a mí y a otros por qué te gusta. 🎉
+[Twittea sobre **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) y dime a mí y a otros por qué te gusta. 🎉
Me encanta escuchar cómo se está utilizando **FastAPI**, qué te ha gustado, en qué proyecto/empresa lo estás usando, etc.
## Vota por FastAPI { #vote-for-fastapi }
-* Vota por **FastAPI** en Slant.
-* Vota por **FastAPI** en AlternativeTo.
-* Di que usas **FastAPI** en StackShare.
+* [Vota por **FastAPI** en Slant](https://www.slant.co/options/34241/~fastapi-review).
+* [Vota por **FastAPI** en AlternativeTo](https://alternativeto.net/software/fastapi/about/).
+* [Di que usas **FastAPI** en StackShare](https://stackshare.io/pypi-fastapi).
## Ayuda a otros con preguntas en GitHub { #help-others-with-questions-in-github }
Puedes intentar ayudar a otros con sus preguntas en:
-* GitHub Discussions
-* GitHub Issues
+* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
+* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
En muchos casos, probablemente ya conozcas la respuesta a esas preguntas. 🤓
-Si estás ayudando mucho a la gente con sus preguntas, te convertirás en un [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank} oficial. 🎉
+Si estás ayudando mucho a la gente con sus preguntas, te convertirás en un [FastAPI Expert](fastapi-people.md#fastapi-experts) oficial. 🎉
Solo recuerda, el punto más importante es: trata de ser amable. La gente llega con sus frustraciones y, en muchos casos, no pregunta de la mejor manera, pero haz todo lo posible por ser amable. 🤗
@@ -104,7 +104,7 @@ En la mayoría de los casos y preguntas hay algo relacionado con el **código or
En muchos casos solo copiarán un fragmento del código, pero eso no es suficiente para **reproducir el problema**.
-* Puedes pedirles que proporcionen un ejemplo mínimo, reproducible, que puedas **copiar-pegar** y ejecutar localmente para ver el mismo error o comportamiento que están viendo, o para entender mejor su caso de uso.
+* Puedes pedirles que proporcionen un [ejemplo mínimo, reproducible](https://stackoverflow.com/help/minimal-reproducible-example), que puedas **copiar-pegar** y ejecutar localmente para ver el mismo error o comportamiento que están viendo, o para entender mejor su caso de uso.
* Si te sientes muy generoso, puedes intentar **crear un ejemplo** así tú mismo, solo basado en la descripción del problema. Solo ten en cuenta que esto podría llevar mucho tiempo y podría ser mejor pedirles que aclaren el problema primero.
@@ -125,7 +125,7 @@ Si responden, hay una alta probabilidad de que hayas resuelto su problema, felic
## Observa el repositorio de GitHub { #watch-the-github-repository }
-Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): https://github.com/fastapi/fastapi. 👀
+Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
Si seleccionas "Watching" en lugar de "Releases only", recibirás notificaciones cuando alguien cree un nuevo issue o pregunta. También puedes especificar que solo deseas que te notifiquen sobre nuevos issues, discusiones, PRs, etc.
@@ -133,7 +133,7 @@ Luego puedes intentar ayudarlos a resolver esas preguntas.
## Haz preguntas { #ask-questions }
-Puedes crear una nueva pregunta en el repositorio de GitHub, por ejemplo, para:
+Puedes [crear una nueva pregunta](https://github.com/fastapi/fastapi/discussions/new?category=questions) en el repositorio de GitHub, por ejemplo, para:
* Hacer una **pregunta** o preguntar sobre un **problema**.
* Sugerir una nueva **funcionalidad**.
@@ -196,12 +196,12 @@ Así que, es realmente importante que realmente leas y ejecutes el código, y me
## Crea un Pull Request { #create-a-pull-request }
-Puedes [contribuir](contributing.md){.internal-link target=_blank} al código fuente con Pull Requests, por ejemplo:
+Puedes [contribuir](contributing.md) al código fuente con Pull Requests, por ejemplo:
* Para corregir un error tipográfico que encontraste en la documentación.
-* Para compartir un artículo, video o podcast que creaste o encontraste sobre FastAPI editando este archivo.
+* Para compartir un artículo, video o podcast que creaste o encontraste sobre FastAPI [editando este archivo](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml).
* Asegúrate de agregar tu enlace al inicio de la sección correspondiente.
-* Para ayudar a [traducir la documentación](contributing.md#translations){.internal-link target=_blank} a tu idioma.
+* Para ayudar a [traducir la documentación](contributing.md#translations) a tu idioma.
* También puedes ayudar a revisar las traducciones creadas por otros.
* Para proponer nuevas secciones de documentación.
* Para corregir un issue/bug existente.
@@ -218,8 +218,8 @@ Hay mucho trabajo por hacer, y para la mayoría de ello, **TÚ** puedes hacerlo.
Las tareas principales que puedes hacer ahora son:
-* [Ayudar a otros con preguntas en GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (ver la sección arriba).
-* [Revisar Pull Requests](#review-pull-requests){.internal-link target=_blank} (ver la sección arriba).
+* [Ayudar a otros con preguntas en GitHub](#help-others-with-questions-in-github) (ver la sección arriba).
+* [Revisar Pull Requests](#review-pull-requests) (ver la sección arriba).
Esas dos tareas son las que **consumen más tiempo**. Ese es el trabajo principal de mantener FastAPI.
@@ -227,11 +227,11 @@ Si puedes ayudarme con eso, **me estás ayudando a mantener FastAPI** y aseguran
## Únete al chat { #join-the-chat }
-Únete al servidor de chat 👥 Discord 👥 y charla con otros en la comunidad de FastAPI.
+Únete al servidor de chat 👥 [Discord](https://discord.gg/VQjSZaeJmf) 👥 y charla con otros en la comunidad de FastAPI.
/// tip | Consejo
-Para preguntas, házlas en GitHub Discussions, hay muchas más probabilidades de que recibas ayuda de parte de los [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}.
+Para preguntas, házlas en [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), hay muchas más probabilidades de que recibas ayuda de parte de los [FastAPI Experts](fastapi-people.md#fastapi-experts).
Usa el chat solo para otras conversaciones generales.
@@ -243,13 +243,13 @@ Ten en cuenta que dado que los chats permiten una "conversación más libre", es
En GitHub, la plantilla te guiará para escribir la pregunta correcta para que puedas obtener más fácilmente una buena respuesta, o incluso resolver el problema por ti mismo antes de preguntar. Y en GitHub puedo asegurarme de responder siempre todo, incluso si lleva tiempo. No puedo hacer eso personalmente con los sistemas de chat. 😅
-Las conversaciones en los sistemas de chat tampoco son tan fácilmente buscables como en GitHub, por lo que las preguntas y respuestas podrían perderse en la conversación. Y solo las que están en GitHub cuentan para convertirse en un [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, por lo que probablemente recibirás más atención en GitHub.
+Las conversaciones en los sistemas de chat tampoco son tan fácilmente buscables como en GitHub, por lo que las preguntas y respuestas podrían perderse en la conversación. Y solo las que están en GitHub cuentan para convertirse en un [FastAPI Expert](fastapi-people.md#fastapi-experts), por lo que probablemente recibirás más atención en GitHub.
Por otro lado, hay miles de usuarios en los sistemas de chat, por lo que hay muchas posibilidades de que encuentres a alguien con quien hablar allí, casi todo el tiempo. 😄
## Hazte sponsor del autor { #sponsor-the-author }
-Si tu **producto/empresa** depende de o está relacionado con **FastAPI** y quieres llegar a sus usuarios, puedes hacerte sponsor del autor (de mí) a través de GitHub sponsors. Según el nivel, podrías obtener algunos beneficios extra, como una insignia en la documentación. 🎁
+Si tu **producto/empresa** depende de o está relacionado con **FastAPI** y quieres llegar a sus usuarios, puedes hacerte sponsor del autor (de mí) a través de [GitHub sponsors](https://github.com/sponsors/tiangolo). Según el nivel, podrías obtener algunos beneficios extra, como una insignia en la documentación. 🎁
---
diff --git a/docs/es/docs/history-design-future.md b/docs/es/docs/history-design-future.md
index 79835440bb..fc1782f988 100644
--- a/docs/es/docs/history-design-future.md
+++ b/docs/es/docs/history-design-future.md
@@ -1,6 +1,6 @@
# Historia, Diseño y Futuro { #history-design-and-future }
-Hace algún tiempo, un usuario de **FastAPI** preguntó:
+Hace algún tiempo, [un usuario de **FastAPI** preguntó](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920):
> ¿Cuál es la historia de este proyecto? Parece haber surgido de la nada y ser increíble en pocas semanas [...]
@@ -14,7 +14,7 @@ Como parte de eso, necesitaba investigar, probar y usar muchas alternativas.
La historia de **FastAPI** es en gran parte la historia de sus predecesores.
-Como se dice en la sección [Alternativas](alternatives.md){.internal-link target=_blank}:
+Como se dice en la sección [Alternativas](alternatives.md):
@@ -44,7 +44,7 @@ Luego pasé algún tiempo diseñando la "API" de desarrollador que quería tener
Probé varias ideas en los editores de Python más populares: PyCharm, VS Code, editores basados en Jedi.
-Según la última Encuesta de Desarrolladores de Python, estos editores cubren alrededor del 80% de los usuarios.
+Según la última [Encuesta de Desarrolladores de Python](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), estos editores cubren alrededor del 80% de los usuarios.
Esto significa que **FastAPI** fue específicamente probado con los editores usados por el 80% de los desarrolladores de Python. Y como la mayoría de los otros editores tienden a funcionar de manera similar, todos sus beneficios deberían funcionar prácticamente para todos los editores.
@@ -54,11 +54,11 @@ Todo de una manera que proporcionara la mejor experiencia de desarrollo para tod
## Requisitos { #requirements }
-Después de probar varias alternativas, decidí que iba a usar **Pydantic** por sus ventajas.
+Después de probar varias alternativas, decidí que iba a usar [**Pydantic**](https://docs.pydantic.dev/) por sus ventajas.
Luego contribuí a este, para hacerlo totalmente compatible con JSON Schema, para soportar diferentes maneras de definir declaraciones de restricciones, y para mejorar el soporte de los editores (chequeo de tipos, autocompletado) basado en las pruebas en varios editores.
-Durante el desarrollo, también contribuí a **Starlette**, el otro requisito clave.
+Durante el desarrollo, también contribuí a [**Starlette**](https://www.starlette.dev/), el otro requisito clave.
## Desarrollo { #development }
@@ -76,4 +76,4 @@ Pero aún así, hay muchas mejoras y funcionalidades por venir.
**FastAPI** tiene un gran futuro por delante.
-Y [tu ayuda](help-fastapi.md){.internal-link target=_blank} es muy apreciada.
+Y [tu ayuda](help-fastapi.md) es muy apreciada.
diff --git a/docs/es/docs/how-to/authentication-error-status-code.md b/docs/es/docs/how-to/authentication-error-status-code.md
index 54afcec8cb..600c30d263 100644
--- a/docs/es/docs/how-to/authentication-error-status-code.md
+++ b/docs/es/docs/how-to/authentication-error-status-code.md
@@ -2,7 +2,7 @@
Antes de FastAPI versión `0.122.0`, cuando las utilidades de seguridad integradas devolvían un error al cliente después de una autenticación fallida, usaban el código de estado HTTP `403 Forbidden`.
-A partir de FastAPI versión `0.122.0`, usan el código de estado HTTP `401 Unauthorized`, más apropiado, y devuelven un `WWW-Authenticate` header adecuado en la response, siguiendo las especificaciones HTTP, RFC 7235, RFC 9110.
+A partir de FastAPI versión `0.122.0`, usan el código de estado HTTP `401 Unauthorized`, más apropiado, y devuelven un `WWW-Authenticate` header adecuado en la response, siguiendo las especificaciones HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized).
Pero si por alguna razón tus clientes dependen del comportamiento anterior, puedes volver a él sobrescribiendo el método `make_not_authenticated_error` en tus clases de seguridad.
diff --git a/docs/es/docs/how-to/conditional-openapi.md b/docs/es/docs/how-to/conditional-openapi.md
index 671100cf8b..cdf5698050 100644
--- a/docs/es/docs/how-to/conditional-openapi.md
+++ b/docs/es/docs/how-to/conditional-openapi.md
@@ -10,7 +10,7 @@ Eso no añade ninguna seguridad extra a tu API, las *path operations* seguirán
Si hay una falla de seguridad en tu código, seguirá existiendo.
-Ocultar la documentación solo hace que sea más difícil entender cómo interactuar con tu API y podría dificultar más depurarla en producción. Podría considerarse simplemente una forma de Seguridad mediante oscuridad.
+Ocultar la documentación solo hace que sea más difícil entender cómo interactuar con tu API y podría dificultar más depurarla en producción. Podría considerarse simplemente una forma de [Seguridad mediante oscuridad](https://en.wikipedia.org/wiki/Security_through_obscurity).
Si quieres asegurar tu API, hay varias cosas mejores que puedes hacer, por ejemplo:
diff --git a/docs/es/docs/how-to/configure-swagger-ui.md b/docs/es/docs/how-to/configure-swagger-ui.md
index 092c310011..8230f4a146 100644
--- a/docs/es/docs/how-to/configure-swagger-ui.md
+++ b/docs/es/docs/how-to/configure-swagger-ui.md
@@ -1,6 +1,6 @@
# Configurar Swagger UI { #configure-swagger-ui }
-Puedes configurar algunos parámetros adicionales de Swagger UI.
+Puedes configurar algunos [parámetros adicionales de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
Para configurarlos, pasa el argumento `swagger_ui_parameters` al crear el objeto de la app `FastAPI()` o a la función `get_swagger_ui_html()`.
@@ -50,7 +50,7 @@ Por ejemplo, para desactivar `deepLinking` podrías pasar estas configuraciones
## Otros parámetros de Swagger UI { #other-swagger-ui-parameters }
-Para ver todas las demás configuraciones posibles que puedes usar, lee la documentación oficial de los parámetros de Swagger UI.
+Para ver todas las demás configuraciones posibles que puedes usar, lee la [documentación oficial de los parámetros de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
## Configuraciones solo de JavaScript { #javascript-only-settings }
diff --git a/docs/es/docs/how-to/custom-docs-ui-assets.md b/docs/es/docs/how-to/custom-docs-ui-assets.md
index faddab0d83..e9a34c5e4d 100644
--- a/docs/es/docs/how-to/custom-docs-ui-assets.md
+++ b/docs/es/docs/how-to/custom-docs-ui-assets.md
@@ -2,13 +2,13 @@
La documentación de la API utiliza **Swagger UI** y **ReDoc**, y cada uno de estos necesita algunos archivos JavaScript y CSS.
-Por defecto, esos archivos se sirven desde un CDN.
+Por defecto, esos archivos se sirven desde un CDN.
Pero es posible personalizarlo, puedes establecer un CDN específico, o servir los archivos tú mismo.
## CDN Personalizado para JavaScript y CSS { #custom-cdn-for-javascript-and-css }
-Digamos que quieres usar un CDN diferente, por ejemplo, quieres usar `https://unpkg.com/`.
+Digamos que quieres usar un CDN diferente, por ejemplo, quieres usar `https://unpkg.com/`.
Esto podría ser útil si, por ejemplo, vives en un país que restringe algunas URLs.
@@ -54,7 +54,7 @@ Ahora, para poder probar que todo funciona, crea una *path operation*:
### Pruébalo { #test-it }
-Ahora, deberías poder ir a tu documentación en http://127.0.0.1:8000/docs, y recargar la página, cargará esos recursos desde el nuevo CDN.
+Ahora, deberías poder ir a tu documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), y recargar la página, cargará esos recursos desde el nuevo CDN.
## self hosting de JavaScript y CSS para la documentación { #self-hosting-javascript-and-css-for-docs }
@@ -93,12 +93,12 @@ Probablemente puedas hacer clic derecho en cada enlace y seleccionar una opción
**Swagger UI** utiliza los archivos:
-* `swagger-ui-bundle.js`
-* `swagger-ui.css`
+* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js)
+* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css)
Y **ReDoc** utiliza el archivo:
-* `redoc.standalone.js`
+* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
Después de eso, tu estructura de archivos podría verse así:
@@ -122,7 +122,7 @@ Después de eso, tu estructura de archivos podría verse así:
### Prueba los archivos estáticos { #test-the-static-files }
-Inicia tu aplicación y ve a http://127.0.0.1:8000/static/redoc.standalone.js.
+Inicia tu aplicación y ve a [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js).
Deberías ver un archivo JavaScript muy largo de **ReDoc**.
@@ -180,6 +180,6 @@ Ahora, para poder probar que todo funciona, crea una *path operation*:
### Prueba la UI de Archivos Estáticos { #test-static-files-ui }
-Ahora, deberías poder desconectar tu WiFi, ir a tu documentación en http://127.0.0.1:8000/docs, y recargar la página.
+Ahora, deberías poder desconectar tu WiFi, ir a tu documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), y recargar la página.
E incluso sin Internet, podrás ver la documentación de tu API e interactuar con ella.
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 ff13196f8a..56013a5c7b 100644
--- a/docs/es/docs/how-to/custom-request-and-route.md
+++ b/docs/es/docs/how-to/custom-request-and-route.md
@@ -18,7 +18,7 @@ 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`).
+* Convertir cuerpos de requests no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).
* Descomprimir cuerpos de requests comprimidos con gzip.
* Registrar automáticamente todos los request bodies.
@@ -32,13 +32,13 @@ 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){.internal-link target=_blank} proporcionado.
+Este es un ejemplo sencillo para demostrar cómo funciona. Si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.
///
-Primero, creamos una clase `GzipRequest`, que sobrescribirá el método `Request.body()` para descomprimir el cuerpo si hay un header apropiado.
+Primero, creamos una clase `GzipRequest`, que sobrescribirá el método `Request.body()` para descomprimir el request body si hay un header apropiado.
-Si no hay `gzip` en el header, no intentará descomprimir el cuerpo.
+Si no hay `gzip` en el header, no intentará descomprimir el request body.
De esa manera, la misma clase de ruta puede manejar requests comprimidos con gzip o no comprimidos.
@@ -60,13 +60,13 @@ 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 cuerpo del request.
+Un `Request` también tiene un `request.receive`, que es una función para "recibir" el request body.
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*.
-Para aprender más sobre el `Request`, revisa la documentación de Starlette sobre Requests.
+Para aprender más sobre el `Request`, revisa [la documentación de Starlette sobre Requests](https://www.starlette.dev/requests/).
///
@@ -82,7 +82,7 @@ Pero debido a nuestros cambios en `GzipRequest.body`, el request body se descomp
/// tip | Consejo
-Para resolver este mismo problema, probablemente sea mucho más fácil usar el `body` en un manejador personalizado para `RequestValidationError` ([Manejo de Errores](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}).
+Para resolver este mismo problema, probablemente sea mucho más fácil usar el `body` en un manejador personalizado para `RequestValidationError` ([Manejo de Errores](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)).
Pero este ejemplo sigue siendo válido y muestra cómo interactuar con los componentes internos.
diff --git a/docs/es/docs/how-to/extending-openapi.md b/docs/es/docs/how-to/extending-openapi.md
index d08fae073a..d00455afd7 100644
--- a/docs/es/docs/how-to/extending-openapi.md
+++ b/docs/es/docs/how-to/extending-openapi.md
@@ -37,7 +37,7 @@ El parámetro `summary` está disponible en OpenAPI 3.1.0 y versiones superiores
Usando la información anterior, puedes usar la misma función de utilidad para generar el esquema de OpenAPI y sobrescribir cada parte que necesites.
-Por ejemplo, vamos a añadir la extensión OpenAPI de ReDoc para incluir un logo personalizado.
+Por ejemplo, vamos a añadir [la extensión OpenAPI de ReDoc para incluir un logo personalizado](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo).
### **FastAPI** normal { #normal-fastapi }
@@ -75,6 +75,6 @@ Ahora puedes reemplazar el método `.openapi()` por tu nueva función.
### Revisa { #check-it }
-Una vez que vayas a http://127.0.0.1:8000/redoc verás que estás usando tu logo personalizado (en este ejemplo, el logo de **FastAPI**):
+Una vez que vayas a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) verás que estás usando tu logo personalizado (en este ejemplo, el logo de **FastAPI**):
diff --git a/docs/es/docs/how-to/general.md b/docs/es/docs/how-to/general.md
index 3a3dc82943..03fe8441e4 100644
--- a/docs/es/docs/how-to/general.md
+++ b/docs/es/docs/how-to/general.md
@@ -4,36 +4,40 @@ Aquí tienes varias indicaciones hacia otros lugares en la documentación, para
## Filtrar Datos - Seguridad { #filter-data-security }
-Para asegurarte de que no devuelves más datos de los que deberías, lee la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md){.internal-link target=_blank}.
+Para asegurarte de que no devuelves más datos de los que deberías, lee la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md).
+
+## Optimizar el Rendimiento del Response - Modelo de Response - Tipo de Retorno { #optimize-response-performance-response-model-return-type }
+
+Para optimizar el rendimiento al devolver datos JSON, usa un tipo de retorno o un modelo de Response; de esa manera Pydantic se encargará de la serialización a JSON del lado de Rust, sin pasar por Python. Lee más en la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md).
## Etiquetas de Documentación - OpenAPI { #documentation-tags-openapi }
-Para agregar etiquetas a tus *path operations*, y agruparlas en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Etiquetas](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}.
+Para agregar etiquetas a tus *path operations*, y agruparlas en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Etiquetas](../tutorial/path-operation-configuration.md#tags).
## Resumen y Descripción de Documentación - OpenAPI { #documentation-summary-and-description-openapi }
-Para agregar un resumen y descripción a tus *path operations*, y mostrarlos en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Resumen y Descripción](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}.
+Para agregar un resumen y descripción a tus *path operations*, y mostrarlos en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Resumen y Descripción](../tutorial/path-operation-configuration.md#summary-and-description).
## Documentación de Descripción de Response - OpenAPI { #documentation-response-description-openapi }
-Para definir la descripción del response, mostrada en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Descripción del Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}.
+Para definir la descripción del response, mostrada en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Descripción del Response](../tutorial/path-operation-configuration.md#response-description).
## Documentar la Deprecación de una *Path Operation* - OpenAPI { #documentation-deprecate-a-path-operation-openapi }
-Para deprecar una *path operation*, y mostrarla en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Deprecación](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}.
+Para deprecar una *path operation*, y mostrarla en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Deprecación](../tutorial/path-operation-configuration.md#deprecate-a-path-operation).
## Convertir cualquier Dato a Compatible con JSON { #convert-any-data-to-json-compatible }
-Para convertir cualquier dato a compatible con JSON, lee la documentación para [Tutorial - Codificador Compatible con JSON](../tutorial/encoder.md){.internal-link target=_blank}.
+Para convertir cualquier dato a compatible con JSON, lee la documentación para [Tutorial - Codificador Compatible con JSON](../tutorial/encoder.md).
## Metadatos OpenAPI - Documentación { #openapi-metadata-docs }
-Para agregar metadatos a tu esquema de OpenAPI, incluyendo una licencia, versión, contacto, etc, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md){.internal-link target=_blank}.
+Para agregar metadatos a tu esquema de OpenAPI, incluyendo una licencia, versión, contacto, etc, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md).
## URL Personalizada de OpenAPI { #openapi-custom-url }
-Para personalizar la URL de OpenAPI (o eliminarla), lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}.
+Para personalizar la URL de OpenAPI (o eliminarla), lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#openapi-url).
## URLs de Documentación de OpenAPI { #openapi-docs-urls }
-Para actualizar las URLs usadas para las interfaces de usuario de documentación generadas automáticamente, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}.
+Para actualizar las URLs usadas para las interfaces de usuario de documentación generadas automáticamente, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#docs-urls).
diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md
index ee77570b3f..11c0cc23c5 100644
--- a/docs/es/docs/how-to/graphql.md
+++ b/docs/es/docs/how-to/graphql.md
@@ -18,18 +18,18 @@ Asegúrate de evaluar si los **beneficios** para tu caso de uso compensan los **
Aquí algunos de los paquetes de **GraphQL** que tienen soporte **ASGI**. Podrías usarlos con **FastAPI**:
-* Strawberry 🍓
- * Con documentación para FastAPI
-* Ariadne
- * Con documentación para FastAPI
-* Tartiflette
- * Con Tartiflette ASGI para proporcionar integración con ASGI
-* Graphene
- * Con starlette-graphene3
+* [Strawberry](https://strawberry.rocks/) 🍓
+ * Con [documentación para FastAPI](https://strawberry.rocks/docs/integrations/fastapi)
+* [Ariadne](https://ariadnegraphql.org/)
+ * Con [documentación para FastAPI](https://ariadnegraphql.org/docs/fastapi-integration)
+* [Tartiflette](https://tartiflette.io/)
+ * Con [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) para proporcionar integración con ASGI
+* [Graphene](https://graphene-python.org/)
+ * Con [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3)
## GraphQL con Strawberry { #graphql-with-strawberry }
-Si necesitas o quieres trabajar con **GraphQL**, **Strawberry** 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 un diseño muy similar 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**.
@@ -37,24 +37,24 @@ Aquí tienes una pequeña vista previa de cómo podrías integrar Strawberry con
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
-Puedes aprender más sobre Strawberry en la documentación de Strawberry.
+Puedes aprender más sobre Strawberry en la [documentación de Strawberry](https://strawberry.rocks/).
-Y también la documentación sobre Strawberry con FastAPI.
+Y también la documentación sobre [Strawberry con FastAPI](https://strawberry.rocks/docs/integrations/fastapi).
## `GraphQLApp` viejo de Starlette { #older-graphqlapp-from-starlette }
-Las versiones anteriores de Starlette incluían una clase `GraphQLApp` para integrar con Graphene.
+Las versiones anteriores de Starlette incluían una clase `GraphQLApp` para integrar con [Graphene](https://graphene-python.org/).
-Fue deprecada de Starlette, pero si tienes código que lo usaba, puedes fácilmente **migrar** a starlette-graphene3, que cubre el mismo caso de uso y tiene una **interfaz casi idéntica**.
+Fue deprecada de Starlette, pero si tienes código que lo usaba, puedes fácilmente **migrar** a [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), que cubre el mismo caso de uso y tiene una **interfaz casi idéntica**.
/// tip | Consejo
-Si necesitas GraphQL, aún te recomendaría revisar Strawberry, ya que se basa en anotaciones de tipos en lugar de clases y tipos personalizados.
+Si necesitas GraphQL, aún te recomendaría revisar [Strawberry](https://strawberry.rocks/), ya que se basa en anotaciones de tipos en lugar de clases y tipos personalizados.
///
## Aprende Más { #learn-more }
-Puedes aprender más sobre **GraphQL** en la documentación oficial de GraphQL.
+Puedes aprender más sobre **GraphQL** en la [documentación oficial de GraphQL](https://graphql.org/).
También puedes leer más sobre cada uno de esos paquetes descritos arriba en sus enlaces.
diff --git a/docs/es/docs/how-to/index.md b/docs/es/docs/how-to/index.md
index 6f5988049a..464028ff24 100644
--- a/docs/es/docs/how-to/index.md
+++ b/docs/es/docs/how-to/index.md
@@ -8,6 +8,6 @@ Si algo parece interesante y útil para tu proyecto, adelante y revísalo, pero
/// tip | Consejo
-Si quieres **aprender FastAPI** de una manera estructurada (recomendado), ve y lee el [Tutorial - Guía de Usuario](../tutorial/index.md){.internal-link target=_blank} capítulo por capítulo en su lugar.
+Si quieres **aprender FastAPI** de una manera estructurada (recomendado), ve y lee el [Tutorial - Guía de Usuario](../tutorial/index.md) capítulo por capítulo en su lugar.
///
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 c862ace902..22d51674d0 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
@@ -22,7 +22,7 @@ Si tienes una app de FastAPI antigua con Pydantic v1, aquí te muestro cómo mig
## Guía oficial { #official-guide }
-Pydantic tiene una Guía de migración oficial de v1 a v2.
+Pydantic tiene una [Guía de migración](https://docs.pydantic.dev/latest/migration/) oficial de v1 a v2.
También incluye qué cambió, cómo las validaciones ahora son más correctas y estrictas, posibles consideraciones, etc.
@@ -30,7 +30,7 @@ Puedes leerla para entender mejor qué cambió.
## Tests { #tests }
-Asegúrate de tener [tests](../tutorial/testing.md){.internal-link target=_blank} para tu app y de ejecutarlos en integración continua (CI).
+Asegúrate de tener [tests](../tutorial/testing.md) para tu app y de ejecutarlos en integración continua (CI).
Así podrás hacer la actualización y asegurarte de que todo sigue funcionando como esperas.
@@ -38,7 +38,7 @@ Así podrás hacer la actualización y asegurarte de que todo sigue funcionando
En muchos casos, cuando usas modelos de Pydantic normales sin personalizaciones, podrás automatizar gran parte del proceso de migración de Pydantic v1 a Pydantic v2.
-Puedes usar `bump-pydantic` del mismo equipo de Pydantic.
+Puedes usar [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) del mismo equipo de Pydantic.
Esta herramienta te ayudará a cambiar automáticamente la mayor parte del código que necesita cambiarse.
diff --git a/docs/es/docs/how-to/testing-database.md b/docs/es/docs/how-to/testing-database.md
index 0717ea5ff7..8dab2ffd93 100644
--- a/docs/es/docs/how-to/testing-database.md
+++ b/docs/es/docs/how-to/testing-database.md
@@ -1,7 +1,7 @@
-# Escribiendo pruebas para una base de datos { #testing-a-database }
+# Escribir pruebas para una base de datos { #testing-a-database }
-Puedes estudiar sobre bases de datos, SQL y SQLModel en la documentación de SQLModel. 🤓
+Puedes estudiar sobre bases de datos, SQL y SQLModel en la [documentación de SQLModel](https://sqlmodel.tiangolo.com/). 🤓
-Hay un mini tutorial sobre el uso de SQLModel con FastAPI. ✨
+Hay un mini [tutorial sobre el uso de SQLModel con FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨
-Ese tutorial incluye una sección sobre escribir pruebas para bases de datos SQL. 😎
+Ese tutorial incluye una sección sobre [escribir pruebas para bases de datos SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index 0544eb9ba4..6aea221427 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -11,25 +11,25 @@
FastAPI framework, alto rendimiento, fácil de aprender, rápido de programar, listo para producción
-
+
-
+
-
+
-
+
---
-**Documentación**: https://fastapi.tiangolo.com
+**Documentación**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/es)
-**Código Fuente**: https://github.com/fastapi/fastapi
+**Código Fuente**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)
---
@@ -40,11 +40,11 @@ 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.
-* **Basado en estándares**: Basado (y completamente compatible) con los estándares abiertos para APIs: OpenAPI (anteriormente conocido como Swagger) y JSON Schema.
+* **Basado en estándares**: Basado (y completamente compatible) con los estándares abiertos para APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (anteriormente conocido como Swagger) y [JSON Schema](https://json-schema.org/).
* estimación basada en pruebas con un equipo de desarrollo interno, construyendo aplicaciones de producción.
@@ -55,51 +55,51 @@ Las funcionalidades clave son:
### Sponsor Keystone { #keystone-sponsor }
{% for sponsor in sponsors.keystone -%}
-
+
{% endfor -%}
### Sponsors Oro y Plata { #gold-and-silver-sponsors }
{% for sponsor in sponsors.gold -%}
-
+
{% endfor -%}
{%- for sponsor in sponsors.silver -%}
-
+
{% endfor %}
-Otros sponsors
+[Otros sponsors](https://fastapi.tiangolo.com/es/fastapi-people/#sponsors)
## Opiniones { #opinions }
"_[...] Estoy usando **FastAPI** un montón estos días. [...] De hecho, estoy planeando usarlo para todos los servicios de **ML de mi equipo en Microsoft**. Algunos de ellos se están integrando en el núcleo del producto **Windows** y algunos productos de **Office**._"
-Kabir Khan -
Microsoft (ref)
+Kabir Khan -
Microsoft (ref)
---
"_Adoptamos el paquete **FastAPI** para crear un servidor **REST** que pueda ser consultado para obtener **predicciones**. [para Ludwig]_"
-Piero Molino, Yaroslav Dudin, y Sai Sumanth Miryala -
Uber (ref)
+Piero Molino, Yaroslav Dudin, y Sai Sumanth Miryala -
Uber (ref)
---
"_**Netflix** se complace en anunciar el lanzamiento de código abierto de nuestro framework de orquestación de **gestión de crisis**: **Dispatch**! [construido con **FastAPI**]_"
-Kevin Glisson, Marc Vilanova, Forest Monsen -
Netflix (ref)
+Kevin Glisson, Marc Vilanova, Forest Monsen -
Netflix (ref)
---
"_Estoy súper emocionado con **FastAPI**. ¡Es tan divertido!_"
-
+Brian Okken -
[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) host del podcast (ref)
---
"_Honestamente, lo que has construido parece súper sólido y pulido. En muchos aspectos, es lo que quería que **Hug** fuera; es realmente inspirador ver a alguien construir eso._"
-
+Timothy Crosley -
[Hug](https://github.com/hugapi/hug) creador (ref)
---
@@ -107,27 +107,27 @@ Las funcionalidades clave son:
"_Nos hemos cambiado a **FastAPI** para nuestras **APIs** [...] Creo que te gustará [...]_"
-
+Ines Montani - Matthew Honnibal -
[fundadores de Explosion AI](https://explosion.ai) - [creadores de spaCy](https://spacy.io) (ref) -
(ref)
---
"_Si alguien está buscando construir una API de Python para producción, altamente recomendaría **FastAPI**. Está **hermosamente diseñado**, es **simple de usar** y **altamente escalable**, se ha convertido en un **componente clave** en nuestra estrategia de desarrollo API primero y está impulsando muchas automatizaciones y servicios como nuestro Ingeniero Virtual TAC._"
-Deon Pillsbury -
Cisco (ref)
+Deon Pillsbury -
Cisco (ref)
---
## Mini documental de FastAPI { #fastapi-mini-documentary }
-Hay un mini documental de FastAPI lanzado a finales de 2025, puedes verlo online:
+Hay un [mini documental de FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE) lanzado a finales de 2025, puedes verlo online:
-
+
## **Typer**, el FastAPI de las CLIs { #typer-the-fastapi-of-clis }
-
+
-Si estás construyendo una aplicación de CLI para ser usada en la terminal en lugar de una API web, revisa **Typer**.
+Si estás construyendo una aplicación de CLI para ser usada en la terminal en lugar de una API web, revisa [**Typer**](https://typer.tiangolo.com/).
**Typer** es el hermano pequeño de FastAPI. Y está destinado a ser el **FastAPI de las CLIs**. ⌨️ 🚀
@@ -135,12 +135,12 @@ Si estás construyendo una aplicación de Starlette para las partes web.
-* Pydantic para las partes de datos.
+* [Starlette](https://www.starlette.dev/) para las partes web.
+* [Pydantic](https://docs.pydantic.dev/) para las partes de datos.
## Instalación { #installation }
-Crea y activa un entorno virtual y luego instala FastAPI:
+Crea y activa un [entorno virtual](https://fastapi.tiangolo.com/es/virtual-environments/) y luego instala FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None):
**Nota**:
-Si no lo sabes, revisa la sección _"¿Con prisa?"_ sobre
`async` y `await` en la documentación.
+Si no lo sabes, revisa la sección _"¿Con prisa?"_ sobre [`async` y `await` en la documentación](https://fastapi.tiangolo.com/es/async/#in-a-hurry).
@@ -210,7 +210,7 @@ Corre el servidor con:
```console
-$ fastapi dev main.py
+$ fastapi dev
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
@@ -235,19 +235,19 @@ INFO: Application startup complete.
-Acerca del comando fastapi dev main.py...
+Acerca del comando fastapi dev...
-El comando `fastapi dev` lee tu archivo `main.py`, detecta la app **FastAPI** en él y arranca un servidor usando Uvicorn.
+El comando `fastapi dev` lee tu archivo `main.py` automáticamente, detecta la app **FastAPI** en él y arranca un servidor usando [Uvicorn](https://www.uvicorn.dev).
Por defecto, `fastapi dev` comenzará con auto-recarga habilitada para el desarrollo local.
-Puedes leer más sobre esto en la documentación del CLI de FastAPI.
+Puedes leer más sobre esto en la [documentación del CLI de FastAPI](https://fastapi.tiangolo.com/es/fastapi-cli/).
### Revísalo { #check-it }
-Abre tu navegador en
http://127.0.0.1:8000/items/5?q=somequery.
+Abre tu navegador en [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery).
Verás el response JSON como:
@@ -264,17 +264,17 @@ Ya creaste una API que:
### Documentación interactiva de la API { #interactive-api-docs }
-Ahora ve a
http://127.0.0.1:8000/docs.
+Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
-Verás la documentación interactiva automática de la API (proporcionada por
Swagger UI):
+Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)):

### Documentación alternativa de la API { #alternative-api-docs }
-Y ahora, ve a
http://127.0.0.1:8000/redoc.
+Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
-Verás la documentación alternativa automática (proporcionada por
ReDoc):
+Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)):

@@ -316,7 +316,7 @@ El servidor `fastapi dev` debería recargarse automáticamente.
### Actualización de la documentación interactiva de la API { #interactive-api-docs-upgrade }
-Ahora ve a
http://127.0.0.1:8000/docs.
+Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
* La documentación interactiva de la API se actualizará automáticamente, incluyendo el nuevo body:
@@ -332,7 +332,7 @@ Ahora ve a
http://127.0.0.1:8000/redoc.
+Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
* La documentación alternativa también reflejará el nuevo parámetro de query y body:
@@ -374,7 +374,7 @@ item: Item
* Parámetros de query.
* Cookies.
* Headers.
- * Forms.
+ * Formularios.
* Archivos.
*
Conversión de datos de salida: convirtiendo de datos y tipos de Python a datos de red (como JSON):
* Convertir tipos de Python (`str`, `int`, `float`, `bool`, `list`, etc).
@@ -442,7 +442,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al
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 y otros paquetes.
+* Integración con **GraphQL** usando [Strawberry](https://strawberry.rocks) y otros paquetes.
* Muchas funcionalidades extra (gracias a Starlette) como:
* **WebSockets**
* pruebas extremadamente fáciles basadas en HTTPX y `pytest`
@@ -452,24 +452,10 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al
FastAPI Cloud, ve y únete a la lista de espera si no lo has hecho. 🚀
+Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com), ve y únete a la lista de espera si no lo has hecho. 🚀
Si ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉), puedes desplegar tu aplicación con un solo comando.
-Antes de desplegar, asegúrate de haber iniciado sesión:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-Luego despliega tu app:
-
```console
@@ -488,7 +474,7 @@ Deploying to FastAPI Cloud...
#### Acerca de FastAPI Cloud { #about-fastapi-cloud }
-**
FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**.
+**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**.
Optimiza el proceso de **construir**, **desplegar** y **acceder** a una API con un esfuerzo mínimo.
@@ -504,9 +490,9 @@ Sigue las guías de tu proveedor de cloud para desplegar apps de FastAPI con ell
## Rendimiento { #performance }
-Benchmarks independientes de TechEmpower muestran aplicaciones **FastAPI** ejecutándose bajo Uvicorn como
uno de los frameworks Python más rápidos disponibles, solo por debajo de Starlette y Uvicorn (usados internamente por FastAPI). (*)
+Benchmarks independientes de TechEmpower muestran aplicaciones **FastAPI** ejecutándose bajo Uvicorn como [uno de los frameworks Python más rápidos disponibles](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), solo por debajo de Starlette y Uvicorn (usados internamente por FastAPI). (*)
-Para entender más sobre esto, ve la sección
Benchmarks.
+Para entender más sobre esto, ve la sección [Benchmarks](https://fastapi.tiangolo.com/es/benchmarks/).
## Dependencias { #dependencies }
@@ -518,19 +504,19 @@ Cuando instalas FastAPI con `pip install "fastapi[standard]"` viene con el grupo
Usadas por Pydantic:
-*
email-validator - para validación de correos electrónicos.
+* [`email-validator`](https://github.com/JoshData/python-email-validator) - para validación de correos electrónicos.
Usadas por Starlette:
-*
httpx - Requerido si deseas usar el `TestClient`.
-*
jinja2 - Requerido si deseas usar la configuración de plantilla por defecto.
-*
python-multipart - Requerido si deseas soportar form
"parsing", con `request.form()`.
+* [`httpx`](https://www.python-httpx.org) - Requerido si deseas usar 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()`.
Usadas por FastAPI:
-*
uvicorn - para el servidor que carga y sirve tu aplicación. Esto incluye `uvicorn[standard]`, que incluye algunas dependencias (por ejemplo, `uvloop`) necesarias para servir con alto rendimiento.
+* [`uvicorn`](https://www.uvicorn.dev) - para el servidor que carga y sirve tu aplicación. Esto incluye `uvicorn[standard]`, que incluye algunas dependencias (por ejemplo, `uvloop`) necesarias para servir con alto rendimiento.
* `fastapi-cli[standard]` - para proporcionar el comando `fastapi`.
- * Esto incluye `fastapi-cloud-cli`, que te permite desplegar tu aplicación de FastAPI en
FastAPI Cloud.
+ * Esto incluye `fastapi-cloud-cli`, que te permite desplegar tu aplicación de FastAPI en [FastAPI Cloud](https://fastapicloud.com).
### Sin Dependencias `standard` { #without-standard-dependencies }
@@ -546,13 +532,13 @@ Existen algunas dependencias adicionales que podrías querer instalar.
Dependencias opcionales adicionales de Pydantic:
-*
pydantic-settings - para la gestión de configuraciones.
-*
pydantic-extra-types - para tipos extra para ser usados con Pydantic.
+* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - para la gestión de configuraciones.
+* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - para tipos extra para ser usados con Pydantic.
Dependencias opcionales adicionales de FastAPI:
-*
orjson - Requerido si deseas usar `ORJSONResponse`.
-*
ujson - Requerido si deseas usar `UJSONResponse`.
+* [`orjson`](https://github.com/ijl/orjson) - Requerido si deseas usar `ORJSONResponse`.
+* [`ujson`](https://github.com/esnme/ultrajson) - Requerido si deseas usar `UJSONResponse`.
## Licencia { #license }
diff --git a/docs/es/docs/project-generation.md b/docs/es/docs/project-generation.md
index 6d48d0be54..11a560eba6 100644
--- a/docs/es/docs/project-generation.md
+++ b/docs/es/docs/project-generation.md
@@ -4,7 +4,7 @@ Las plantillas, aunque normalmente vienen con una configuración específica, es
Puedes usar esta plantilla para comenzar, ya que incluye gran parte de la configuración inicial, seguridad, base de datos y algunos endpoints de API ya hechos para ti.
-Repositorio de GitHub:
Plantilla Full Stack FastAPI
+Repositorio de GitHub: [Plantilla Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template)
## Plantilla Full Stack FastAPI - Stack de tecnología y funcionalidades { #full-stack-fastapi-template-technology-stack-and-features }
diff --git a/docs/es/docs/python-types.md b/docs/es/docs/python-types.md
index 28e2953d35..5d60ea22c4 100644
--- a/docs/es/docs/python-types.md
+++ b/docs/es/docs/python-types.md
@@ -80,7 +80,7 @@ Esas son las "anotaciones de tipos":
{* ../../docs_src/python_types/tutorial002_py310.py hl[1] *}
-Eso no es lo mismo que declarar valores predeterminados como sería con:
+Eso no es lo mismo que declarar valores por defecto como sería con:
```Python
first_name="john", last_name="doe"
@@ -269,7 +269,7 @@ No significa "`one_person` es la **clase** llamada `Person`".
## Modelos Pydantic { #pydantic-models }
-
Pydantic es un paquete de Python para realizar la validación de datos.
+[Pydantic](https://docs.pydantic.dev/) es un paquete de Python para realizar la validación de datos.
Declaras la "forma" de los datos como clases con atributos.
@@ -285,13 +285,13 @@ Un ejemplo de la documentación oficial de Pydantic:
/// info | Información
-Para saber más sobre
Pydantic, revisa su documentación.
+Para saber más sobre [Pydantic, revisa su documentación](https://docs.pydantic.dev/).
///
**FastAPI** está completamente basado en Pydantic.
-Verás mucho más de todo esto en práctica en el [Tutorial - Guía del Usuario](tutorial/index.md){.internal-link target=_blank}.
+Verás mucho más de todo esto en práctica en el [Tutorial - Guía del Usuario](tutorial/index.md).
## Anotaciones de tipos con metadata { #type-hints-with-metadata-annotations }
@@ -337,12 +337,12 @@ Con **FastAPI** declaras parámetros con anotaciones de tipos y obtienes:
* **Documentar** la API usando OpenAPI:
* Que luego es usada por las interfaces de documentación interactiva automática.
-Todo esto puede sonar abstracto. No te preocupes. Verás todo esto en acción en el [Tutorial - Guía del Usuario](tutorial/index.md){.internal-link target=_blank}.
+Todo esto puede sonar abstracto. No te preocupes. Verás todo esto en acción en el [Tutorial - Guía del Usuario](tutorial/index.md).
Lo importante es que al usar tipos estándar de Python, en un solo lugar (en lugar de agregar más clases, decoradores, etc.), **FastAPI** hará gran parte del trabajo por ti.
/// info | Información
-Si ya revisaste todo el tutorial y volviste para ver más sobre tipos, un buen recurso es
la "cheat sheet" de `mypy`.
+Si ya revisaste todo el tutorial y volviste para ver más sobre tipos, un buen recurso es [la "cheat sheet" de `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html).
///
diff --git a/docs/es/docs/tutorial/background-tasks.md b/docs/es/docs/tutorial/background-tasks.md
index 10ad4b5ebb..6ae265b919 100644
--- a/docs/es/docs/tutorial/background-tasks.md
+++ b/docs/es/docs/tutorial/background-tasks.md
@@ -61,7 +61,7 @@ Y luego otra tarea en segundo plano generada en la *path operation function* esc
## Detalles Técnicos { #technical-details }
-La clase `BackgroundTasks` proviene directamente de
`starlette.background`.
+La clase `BackgroundTasks` proviene directamente de [`starlette.background`](https://www.starlette.dev/background/).
Se importa/incluye directamente en FastAPI para que puedas importarla desde `fastapi` y evitar importar accidentalmente la alternativa `BackgroundTask` (sin la `s` al final) de `starlette.background`.
@@ -69,11 +69,11 @@ Al usar solo `BackgroundTasks` (y no `BackgroundTask`), es posible usarla como u
Todavía es posible usar `BackgroundTask` solo en FastAPI, pero debes crear el objeto en tu código y devolver una `Response` de Starlette incluyéndolo.
-Puedes ver más detalles en
la documentación oficial de Starlette sobre Background Tasks.
+Puedes ver más detalles en [la documentación oficial de Starlette sobre Background Tasks](https://www.starlette.dev/background/).
## Advertencia { #caveat }
-Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes como
Celery.
+Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes como [Celery](https://docs.celeryq.dev).
Tienden a requerir configuraciones más complejas, un gestor de cola de mensajes/trabajos, como RabbitMQ o Redis, pero te permiten ejecutar tareas en segundo plano en múltiples procesos, y especialmente, en múltiples servidores.
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index 96b58a7207..27a034f47d 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -123,7 +123,7 @@ Ahora utilizaremos una dependencia simple para leer un header `X-Token` personal
Estamos usando un header inventado para simplificar este ejemplo.
-Pero en casos reales obtendrás mejores resultados usando las [utilidades de Seguridad](security/index.md){.internal-link target=_blank} integradas.
+Pero en casos reales obtendrás mejores resultados usando las [utilidades de Seguridad](security/index.md) integradas.
///
@@ -169,7 +169,7 @@ Y podemos agregar una lista de `dependencies` que se añadirá a todas las *path
/// tip | Consejo
-Nota que, al igual que [dependencias en decoradores de *path operations*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ningún valor será pasado a tu *path operation function*.
+Nota que, al igual que [dependencias en decoradores de *path operations*](dependencies/dependencies-in-path-operation-decorators.md), ningún valor será pasado a tu *path operation function*.
///
@@ -185,8 +185,8 @@ El resultado final es que los paths de item son ahora:
* 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){.internal-link target=_blank}, y luego las dependencias de parámetros normales.
- * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}.
+ * 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
@@ -303,7 +303,7 @@ Y como la mayor parte de tu lógica ahora vivirá en su propio módulo específi
Importas y creas una clase `FastAPI` como normalmente.
-Y podemos incluso declarar [dependencias globales](dependencies/global-dependencies.md){.internal-link target=_blank} que se combinarán con las dependencias para cada `APIRouter`:
+Y podemos incluso declarar [dependencias globales](dependencies/global-dependencies.md) que se combinarán con las dependencias para cada `APIRouter`:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
@@ -353,7 +353,7 @@ La segunda versión es un "import absoluto":
from app.routers import items, users
```
-Para aprender más sobre Paquetes y Módulos de Python, lee
la documentación oficial de Python sobre Módulos.
+Para aprender más sobre Paquetes y Módulos de Python, lee [la documentación oficial de Python sobre Módulos](https://docs.python.org/3/tutorial/modules.html).
///
@@ -465,6 +465,37 @@ Como no podemos simplemente aislarlos y "montarlos" independientemente del resto
///
+## Configurar el `entrypoint` en `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml }
+
+Como tu objeto `app` de FastAPI vive en `app/main.py`, puedes configurar el `entrypoint` en tu archivo `pyproject.toml` así:
+
+```toml
+[tool.fastapi]
+entrypoint = "app.main:app"
+```
+
+que es equivalente a importar como:
+
+```python
+from app.main import app
+```
+
+De esa manera el comando `fastapi` sabrá dónde encontrar tu app.
+
+/// Note | Nota
+
+También podrías pasar la ruta al comando, como:
+
+```console
+$ fastapi dev app/main.py
+```
+
+Pero tendrías que recordar pasar la ruta correcta cada vez que llames al comando `fastapi`.
+
+Además, otras herramientas podrían no ser capaces de encontrarla, 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`.
+
+///
+
## Revisa la documentación automática de la API { #check-the-automatic-api-docs }
Ahora, ejecuta tu app:
@@ -472,14 +503,14 @@ Ahora, ejecuta tu app:
```console
-$ fastapi dev app/main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
-Y abre la documentación en
http://127.0.0.1:8000/docs.
+Y abre la documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Verás la documentación automática de la API, incluyendo los paths de todos los submódulos, usando los paths correctos (y prefijos) y los tags correctos:
diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md
index 5f723e4c9f..742f78d420 100644
--- a/docs/es/docs/tutorial/body-nested-models.md
+++ b/docs/es/docs/tutorial/body-nested-models.md
@@ -1,6 +1,6 @@
# Cuerpo - Modelos Anidados { #body-nested-models }
-Con **FastAPI**, puedes definir, validar, documentar y usar modelos anidados de manera arbitraria (gracias a Pydantic).
+Con **FastAPI**, puedes definir, validar, documentar y usar modelos profundamente anidados de manera arbitraria (gracias a Pydantic).
## Campos de lista { #list-fields }
@@ -96,7 +96,7 @@ Nuevamente, haciendo solo esa declaración, con **FastAPI** obtienes:
Además de tipos singulares normales como `str`, `int`, `float`, etc., puedes usar tipos singulares más complejos que heredan de `str`.
-Para ver todas las opciones que tienes, revisa el
Overview de Tipos de Pydantic. Verás algunos ejemplos en el siguiente capítulo.
+Para ver todas las opciones que tienes, Revisa [Resumen de tipos de Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Verás algunos ejemplos en el siguiente capítulo.
Por ejemplo, como en el modelo `Image` tenemos un campo `url`, podemos declararlo como una instance de `HttpUrl` de Pydantic en lugar de un `str`:
diff --git a/docs/es/docs/tutorial/body-updates.md b/docs/es/docs/tutorial/body-updates.md
index e75e29b54b..1b309ebbf4 100644
--- a/docs/es/docs/tutorial/body-updates.md
+++ b/docs/es/docs/tutorial/body-updates.md
@@ -2,7 +2,7 @@
## Actualización reemplazando con `PUT` { #update-replacing-with-put }
-Para actualizar un ítem puedes utilizar la operación de
HTTP `PUT`.
+Para actualizar un ítem puedes utilizar la operación de [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT).
Puedes usar el `jsonable_encoder` para convertir los datos de entrada en datos que se puedan almacenar como JSON (por ejemplo, con una base de datos NoSQL). Por ejemplo, convirtiendo `datetime` a `str`.
@@ -28,7 +28,7 @@ Y los datos se guardarían con ese "nuevo" `tax` de `10.5`.
## Actualizaciones parciales con `PATCH` { #partial-updates-with-patch }
-También puedes usar la operación de
HTTP `PATCH` para actualizar *parcialmente* datos.
+También puedes usar la operación de [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) para actualizar *parcialmente* datos.
Esto significa que puedes enviar solo los datos que deseas actualizar, dejando el resto intacto.
@@ -95,6 +95,6 @@ Observa que el modelo de entrada sigue siendo validado.
Entonces, si deseas recibir actualizaciones parciales que puedan omitir todos los atributos, necesitas tener un modelo con todos los atributos marcados como opcionales (con valores por defecto o `None`).
-Para distinguir entre los modelos con todos los valores opcionales para **actualizaciones** y modelos con valores requeridos para **creación**, puedes utilizar las ideas descritas en [Modelos Extra](extra-models.md){.internal-link target=_blank}.
+Para distinguir entre los modelos con todos los valores opcionales para **actualizaciones** y modelos con valores requeridos para **creación**, puedes utilizar las ideas descritas en [Modelos Extra](extra-models.md).
///
diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md
index 3adf2e65c5..7c3b8e9d91 100644
--- a/docs/es/docs/tutorial/body.md
+++ b/docs/es/docs/tutorial/body.md
@@ -6,7 +6,7 @@ Un **request** body es un dato enviado por el cliente a tu API. Un **response**
Tu API casi siempre tiene que enviar un **response** body. Pero los clientes no necesariamente necesitan enviar **request bodies** todo el tiempo, a veces solo solicitan un path, quizás con algunos parámetros de query, pero no envían un body.
-Para declarar un **request** body, usas modelos de
Pydantic con todo su poder y beneficios.
+Para declarar un **request** body, usas modelos de [Pydantic](https://docs.pydantic.dev/) con todo su poder y beneficios.
/// info | Información
@@ -73,7 +73,7 @@ Con solo esa declaración de tipo en Python, **FastAPI** hará lo siguiente:
* Si los datos son inválidos, devolverá un error claro e indicado, señalando exactamente dónde y qué fue lo incorrecto.
* Proporcionar los datos recibidos en el parámetro `item`.
* Como lo declaraste en la función como de tipo `Item`, también tendrás todo el soporte del editor (autocompletado, etc.) para todos los atributos y sus tipos.
-* Generar definiciones de
JSON Schema para tu modelo, que también puedes usar en cualquier otro lugar si tiene sentido para tu proyecto.
+* Generar definiciones de [JSON Schema](https://json-schema.org) para tu modelo, que también puedes usar en cualquier otro lugar si tiene sentido para tu proyecto.
* Esos esquemas serán parte del esquema de OpenAPI generado y usados por las
UIs de documentación automática.
## Documentación automática { #automatic-docs }
@@ -102,15 +102,15 @@ Y fue rigurosamente probado en la fase de diseño, antes de cualquier implementa
Incluso se hicieron algunos cambios en Pydantic para admitir esto.
-Las capturas de pantalla anteriores se tomaron con
Visual Studio Code.
+Las capturas de pantalla anteriores se tomaron con [Visual Studio Code](https://code.visualstudio.com).
-Pero obtendrías el mismo soporte en el editor con
PyCharm y la mayoría de los otros editores de Python:
+Pero obtendrías el mismo soporte en el editor con [PyCharm](https://www.jetbrains.com/pycharm/) y la mayoría de los otros editores de Python:

/// tip | Consejo
-Si usas
PyCharm como tu editor, puedes usar el
Pydantic PyCharm Plugin.
+Si usas [PyCharm](https://www.jetbrains.com/pycharm/) como tu editor, puedes usar el [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/).
Mejora el soporte del editor para modelos de Pydantic, con:
@@ -163,4 +163,4 @@ Pero agregar las anotaciones de tipos permitirá que tu editor te brinde un mejo
## Sin Pydantic { #without-pydantic }
-Si no quieres usar modelos de Pydantic, también puedes usar parámetros **Body**. Consulta la documentación para [Body - Múltiples parámetros: Valores singulares en el body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
+Si no quieres usar modelos de Pydantic, también puedes usar parámetros **Body**. Consulta la documentación para [Body - Múltiples parámetros: Valores singulares en el body](body-multiple-params.md#singular-values-in-body).
diff --git a/docs/es/docs/tutorial/cors.md b/docs/es/docs/tutorial/cors.md
index a118d814b0..ec547178be 100644
--- a/docs/es/docs/tutorial/cors.md
+++ b/docs/es/docs/tutorial/cors.md
@@ -1,6 +1,6 @@
# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing }
-
CORS o "Cross-Origin Resource Sharing" se refiere a situaciones en las que un frontend que se ejecuta en un navegador tiene código JavaScript que se comunica con un backend, y el backend está en un "origen" diferente al frontend.
+[CORS o "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) se refiere a situaciones en las que un frontend que se ejecuta en un navegador tiene código JavaScript que se comunica con un backend, y el backend está en un "origen" diferente al frontend.
## Origen { #origin }
@@ -56,10 +56,10 @@ Se admiten los siguientes argumentos:
* `allow_origins` - Una lista de orígenes que deberían estar permitidos para hacer requests cross-origin. Por ejemplo, `['https://example.org', 'https://www.example.org']`. Puedes usar `['*']` para permitir cualquier origen.
* `allow_origin_regex` - Una cadena regex para coincidir con orígenes que deberían estar permitidos para hacer requests cross-origin. por ejemplo, `'https://.*\.example\.org'`.
* `allow_methods` - Una lista de métodos HTTP que deberían estar permitidos para requests cross-origin. Por defecto es `['GET']`. Puedes usar `['*']` para permitir todos los métodos estándar.
-* `allow_headers` - Una lista de headers de request HTTP que deberían estar soportados para requests cross-origin. Por defecto es `[]`. Puedes usar `['*']` para permitir todos los headers. Los headers `Accept`, `Accept-Language`, `Content-Language` y `Content-Type` siempre están permitidos para
requests CORS simples.
+* `allow_headers` - Una lista de headers de request HTTP que deberían estar soportados para requests cross-origin. Por defecto es `[]`. Puedes usar `['*']` para permitir todos los headers. Los headers `Accept`, `Accept-Language`, `Content-Language` y `Content-Type` siempre están permitidos para [requests CORS simples](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests).
* `allow_credentials` - Indica que las cookies deberían estar soportadas para requests cross-origin. Por defecto es `False`.
- Ninguno de `allow_origins`, `allow_methods` y `allow_headers` puede establecerse a `['*']` si `allow_credentials` está configurado a `True`. Todos deben ser
especificados explícitamente.
+ Ninguno de `allow_origins`, `allow_methods` y `allow_headers` puede establecerse a `['*']` si `allow_credentials` está configurado a `True`. Todos deben ser [especificados explícitamente](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards).
* `expose_headers` - Indica cualquier header de response que debería ser accesible para el navegador. Por defecto es `[]`.
* `max_age` - Establece un tiempo máximo en segundos para que los navegadores almacenen en caché los responses CORS. Por defecto es `600`.
@@ -78,7 +78,7 @@ Cualquier request con un header `Origin`. En este caso, el middleware pasará el
## Más info { #more-info }
-Para más información sobre
CORS, revisa la
documentación de CORS de Mozilla.
+Para más información sobre
CORS, revisa la [documentación de CORS de Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
/// note | Detalles Técnicos
diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md
index a2d47f2da7..b5d0704e06 100644
--- a/docs/es/docs/tutorial/debugging.md
+++ b/docs/es/docs/tutorial/debugging.md
@@ -74,7 +74,7 @@ no se ejecutará.
/// info | Información
-Para más información, revisa
la documentación oficial de Python.
+Para más información, revisa [la documentación oficial de Python](https://docs.python.org/3/library/__main__.html).
///
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 5eadbe7e1f..72e4e973e9 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -32,7 +32,7 @@ También puede ayudar a evitar confusiones para nuevos desarrolladores que vean
En este ejemplo usamos headers personalizados inventados `X-Key` y `X-Token`.
-Pero en casos reales, al implementar seguridad, obtendrías más beneficios usando las [Utilidades de Seguridad integradas (el próximo capítulo)](../security/index.md){.internal-link target=_blank}.
+Pero en casos reales, al implementar seguridad, obtendrías más beneficios usando las [Utilidades de Seguridad integradas (el próximo capítulo)](../security/index.md).
///
@@ -62,7 +62,7 @@ Así que, puedes reutilizar una dependencia normal (que devuelve un valor) que y
## Dependencias para un grupo de *path operations* { #dependencies-for-a-group-of-path-operations }
-Más adelante, cuando leas sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), posiblemente con múltiples archivos, aprenderás cómo declarar un único parámetro `dependencies` para un grupo de *path operations*.
+Más adelante, cuando leas sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md)), posiblemente con múltiples archivos, aprenderás cómo declarar un único parámetro `dependencies` para un grupo de *path operations*.
## Dependencias Globales { #global-dependencies }
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
index 2cd68eddd2..084d72aa40 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -14,8 +14,8 @@ Asegúrate de usar `yield` una sola vez por dependencia.
Cualquier función que sea válida para usar con:
-*
`@contextlib.contextmanager` o
-*
`@contextlib.asynccontextmanager`
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) o
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
sería válida para usar como una dependencia en **FastAPI**.
@@ -27,7 +27,7 @@ De hecho, FastAPI usa esos dos decoradores internamente.
Por ejemplo, podrías usar esto para crear una sesión de base de datos y cerrarla después de finalizar.
-Solo el código anterior e incluyendo la declaración `yield` se ejecuta antes de crear un response:
+Solo el código anterior e incluyendo el `yield` statement se ejecuta antes de crear un response:
{* ../../docs_src/dependencies/tutorial007_py310.py hl[2:4] *}
@@ -35,7 +35,7 @@ El valor generado es lo que se inyecta en *path operations* y otras dependencias
{* ../../docs_src/dependencies/tutorial007_py310.py hl[4] *}
-El código posterior a la declaración `yield` se ejecuta después del response:
+El código posterior al `yield` statement se ejecuta después del response:
{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *}
@@ -87,7 +87,7 @@ Puedes tener cualquier combinación de dependencias que quieras.
/// note | Detalles técnicos
-Esto funciona gracias a los
Context Managers de Python.
+Esto funciona gracias a los [Context Managers](https://docs.python.org/3/library/contextlib.html) de Python.
**FastAPI** los utiliza internamente para lograr esto.
@@ -111,7 +111,7 @@ Pero está ahí para ti si la necesitas. 🤓
{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
-Si quieres capturar excepciones y crear un response personalizado en base a eso, crea un [Manejador de Excepciones Personalizado](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}.
+Si quieres capturar excepciones y crear un response personalizado en base a eso, crea un [Manejador de Excepciones Personalizado](../handling-errors.md#install-custom-exception-handlers).
## Dependencias con `yield` y `except` { #dependencies-with-yield-and-except }
@@ -233,14 +233,14 @@ 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){.internal-link target=_blank}.
+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 }
-Los "Context Managers" son aquellos objetos de Python que puedes usar en una declaración `with`.
+Los "Context Managers" son aquellos objetos de Python que puedes usar en un `with` statement.
-Por ejemplo,
puedes usar `with` para leer un archivo:
+Por ejemplo, [puedes usar `with` para leer un archivo](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files):
```Python
with open("./somefile.txt") as f:
@@ -264,7 +264,7 @@ Si apenas estás comenzando con **FastAPI**, podrías querer omitirlo por ahora.
///
-En Python, puedes crear Context Managers
creando una clase con dos métodos: `__enter__()` y `__exit__()`.
+En Python, puedes crear Context Managers [creando una clase con dos métodos: `__enter__()` y `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers).
También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` usando
`with` o `async with` en la función de dependencia:
@@ -275,8 +275,8 @@ También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` us
Otra manera de crear un context manager es con:
-*
`@contextlib.contextmanager` o
-*
`@contextlib.asynccontextmanager`
+* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) o
+* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
usándolos para decorar una función con un solo `yield`.
diff --git a/docs/es/docs/tutorial/dependencies/global-dependencies.md b/docs/es/docs/tutorial/dependencies/global-dependencies.md
index 567e69cf0c..661474f716 100644
--- a/docs/es/docs/tutorial/dependencies/global-dependencies.md
+++ b/docs/es/docs/tutorial/dependencies/global-dependencies.md
@@ -2,14 +2,14 @@
Para algunos tipos de aplicaciones, podrías querer agregar dependencias a toda la aplicación.
-Similar a como puedes [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, puedes agregarlos a la aplicación de `FastAPI`.
+Similar a como puedes [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md), puedes agregarlos a la aplicación de `FastAPI`.
En ese caso, se aplicarán a todas las *path operations* en la aplicación:
{* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *}
-Y todas las ideas en la sección sobre [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} siguen aplicándose, pero en este caso, a todas las *path operations* en la app.
+Y todas las ideas en la sección sobre [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md) siguen aplicándose, pero en este caso, a todas las *path operations* en la app.
## Dependencias para grupos de *path operations* { #dependencies-for-groups-of-path-operations }
-Más adelante, al leer sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), posiblemente con múltiples archivos, aprenderás cómo declarar un solo parámetro de `dependencies` para un grupo de *path operations*.
+Más adelante, al leer sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md)), posiblemente con múltiples archivos, aprenderás cómo declarar un solo parámetro de `dependencies` para un grupo de *path operations*.
diff --git a/docs/es/docs/tutorial/dependencies/index.md b/docs/es/docs/tutorial/dependencies/index.md
index 4eb31196f7..ed5783f39d 100644
--- a/docs/es/docs/tutorial/dependencies/index.md
+++ b/docs/es/docs/tutorial/dependencies/index.md
@@ -57,7 +57,7 @@ FastAPI agregó soporte para `Annotated` (y comenzó a recomendarlo) en la versi
Si tienes una versión anterior, obtendrás errores al intentar usar `Annotated`.
-Asegúrate de [Actualizar la versión de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} al menos a la 0.95.1 antes de usar `Annotated`.
+Asegúrate de [Actualizar la versión de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) al menos a la 0.95.1 antes de usar `Annotated`.
///
@@ -152,7 +152,7 @@ No importa. **FastAPI** sabrá qué hacer.
/// note | Nota
-Si no lo sabes, revisa la sección [Async: *"¿Con prisa?"*](../../async.md#in-a-hurry){.internal-link target=_blank} sobre `async` y `await` en la documentación.
+Si no lo sabes, revisa la sección [Async: *"¿Con prisa?"*](../../async.md#in-a-hurry) sobre `async` y `await` en la documentación.
///
diff --git a/docs/es/docs/tutorial/encoder.md b/docs/es/docs/tutorial/encoder.md
index df6099a8b9..2a83153a6c 100644
--- a/docs/es/docs/tutorial/encoder.md
+++ b/docs/es/docs/tutorial/encoder.md
@@ -12,7 +12,7 @@ Imaginemos que tienes una base de datos `fake_db` que solo recibe datos compatib
Por ejemplo, no recibe objetos `datetime`, ya que no son compatibles con JSON.
-Entonces, un objeto `datetime` tendría que ser convertido a un `str` que contenga los datos en
formato ISO.
+Entonces, un objeto `datetime` tendría que ser convertido a un `str` que contenga los datos en [formato ISO](https://en.wikipedia.org/wiki/ISO_8601).
De la misma manera, esta base de datos no recibiría un modelo de Pydantic (un objeto con atributos), solo un `dict`.
@@ -24,7 +24,7 @@ Recibe un objeto, como un modelo de Pydantic, y devuelve una versión compatible
En este ejemplo, convertiría el modelo de Pydantic a un `dict`, y el `datetime` a un `str`.
-El resultado de llamarlo es algo que puede ser codificado con la función estándar de Python
`json.dumps()`.
+El resultado de llamarlo es algo que puede ser codificado con la función estándar de Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps).
No devuelve un gran `str` que contenga los datos en formato JSON (como un string). Devuelve una estructura de datos estándar de Python (por ejemplo, un `dict`) con valores y sub-valores que son todos compatibles con JSON.
diff --git a/docs/es/docs/tutorial/extra-data-types.md b/docs/es/docs/tutorial/extra-data-types.md
index e876921ba4..b92d0fcd48 100644
--- a/docs/es/docs/tutorial/extra-data-types.md
+++ b/docs/es/docs/tutorial/extra-data-types.md
@@ -36,7 +36,7 @@ Aquí hay algunos de los tipos de datos adicionales que puedes usar:
* `datetime.timedelta`:
* Un `datetime.timedelta` de Python.
* En requests y responses se representará como un `float` de segundos totales.
- * Pydantic también permite representarlo como una "codificación de diferencia horaria ISO 8601",
consulta la documentación para más información.
+ * Pydantic también permite representarlo como una "codificación de diferencia horaria ISO 8601", [consulta la documentación para más información](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
* `frozenset`:
* En requests y responses, tratado igual que un `set`:
* En requests, se leerá una list, eliminando duplicados y convirtiéndola en un `set`.
@@ -45,11 +45,11 @@ Aquí hay algunos de los tipos de datos adicionales que puedes usar:
* `bytes`:
* `bytes` estándar de Python.
* En requests y responses se tratará como `str`.
- * El esquema generado especificará que es un `str` con "binary" como "format".
+ * El esquema generado especificará que es un `str` con `binary` como "format".
* `Decimal`:
* `Decimal` estándar de Python.
* En requests y responses, manejado igual que un `float`.
-* Puedes revisar todos los tipos de datos válidos de Pydantic aquí:
Tipos de datos de Pydantic.
+* Puedes revisar todos los tipos de datos válidos de Pydantic aquí: [Tipos de datos de Pydantic](https://docs.pydantic.dev/latest/usage/types/types/).
## Ejemplo { #example }
diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md
index 4621b2db2e..4a3b75b5bc 100644
--- a/docs/es/docs/tutorial/extra-models.md
+++ b/docs/es/docs/tutorial/extra-models.md
@@ -12,7 +12,7 @@ Esto es especialmente el caso para los modelos de usuario, porque:
Nunca almacenes contraseñas de usuarios en texto plano. Siempre almacena un "hash seguro" que puedas verificar luego.
-Si no lo sabes, aprenderás qué es un "hash de contraseña" en los [capítulos de seguridad](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.
+Si no lo sabes, aprenderás qué es un "hash de contraseña" en los [capítulos de seguridad](security/simple-oauth2.md#password-hashing).
///
@@ -162,11 +162,11 @@ Puedes declarar un response que sea la `Union` de dos o más tipos, eso signific
Se definirá en OpenAPI con `anyOf`.
-Para hacerlo, usa la anotación de tipos estándar de Python
`typing.Union`:
+Para hacerlo, usa la anotación de tipos estándar de Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union):
/// note | Nota
-Al definir una
`Union`, incluye el tipo más específico primero, seguido por el tipo menos específico. En el ejemplo a continuación, el más específico `PlaneItem` viene antes de `CarItem` en `Union[PlaneItem, CarItem]`.
+Al definir una [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions), incluye el tipo más específico primero, seguido por el tipo menos específico. En el ejemplo a continuación, el más específico `PlaneItem` viene antes de `CarItem` en `Union[PlaneItem, CarItem]`.
///
diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md
index b7ffd2c2ab..1fcfdc1402 100644
--- a/docs/es/docs/tutorial/first-steps.md
+++ b/docs/es/docs/tutorial/first-steps.md
@@ -11,7 +11,7 @@ Ejecuta el servidor en vivo:
```console
-$
fastapi dev
main.py
+$
fastapi dev
FastAPI Starting development server 🚀
@@ -58,7 +58,7 @@ Esa línea muestra la URL donde tu aplicación está siendo servida, en tu máqu
### Revisa { #check-it }
-Abre tu navegador en
http://127.0.0.1:8000.
+Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000).
Verás el response JSON como:
@@ -68,17 +68,17 @@ Verás el response JSON como:
### Documentación interactiva de la API { #interactive-api-docs }
-Ahora ve a
http://127.0.0.1:8000/docs.
+Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
-Verás la documentación interactiva automática de la API (proporcionada por
Swagger UI):
+Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)):

### Documentación alternativa de la API { #alternative-api-docs }
-Y ahora, ve a
http://127.0.0.1:8000/redoc.
+Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
-Verás la documentación alternativa automática (proporcionada por
ReDoc):
+Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)):

@@ -92,7 +92,7 @@ Un "esquema" es una definición o descripción de algo. No el código que lo imp
#### Esquema de la API { #api-schema }
-En este caso,
OpenAPI es una especificación que dicta cómo definir un esquema de tu API.
+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.
@@ -110,7 +110,7 @@ OpenAPI define un esquema de API para tu API. Y ese esquema incluye definiciones
Si tienes curiosidad por cómo se ve el esquema OpenAPI en bruto, FastAPI automáticamente genera un JSON (esquema) con las descripciones de toda tu API.
-Puedes verlo directamente en:
http://127.0.0.1:8000/openapi.json.
+Puedes verlo directamente en: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
Mostrará un JSON que empieza con algo como:
@@ -143,9 +143,58 @@ Y hay docenas de alternativas, todas basadas en OpenAPI. Podrías añadir fácil
También podrías usarlo para generar código automáticamente, para clientes que se comuniquen con tu API. Por ejemplo, aplicaciones frontend, móviles o IoT.
+### Configura el `entrypoint` de la app en `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
+
+Puedes configurar dónde está tu app en un archivo `pyproject.toml` así:
+
+```toml
+[tool.fastapi]
+entrypoint = "main:app"
+```
+
+Ese `entrypoint` le dirá al comando `fastapi` que debe hacer el import de la app así:
+
+```python
+from main import app
+```
+
+Si tu código estuviera estructurado así:
+
+```
+.
+├── backend
+│ ├── main.py
+│ ├── __init__.py
+```
+
+Entonces pondrías el `entrypoint` como:
+
+```toml
+[tool.fastapi]
+entrypoint = "backend.main:app"
+```
+
+lo cual sería equivalente a:
+
+```python
+from backend.main import app
+```
+
+### `fastapi dev` con path { #fastapi-dev-with-path }
+
+También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará el objeto app de FastAPI que debe usar:
+
+```console
+$ fastapi dev main.py
+```
+
+Pero tendrías que recordar pasar el path 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`.
+
### Despliega tu app (opcional) { #deploy-your-app-optional }
-Opcionalmente puedes desplegar tu app de FastAPI en
FastAPI Cloud, ve y únete a la lista de espera si aún no lo has hecho. 🚀
+Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com), ve y únete a la lista de espera si aún no lo has hecho. 🚀
Si ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉), puedes desplegar tu aplicación con un solo comando.
@@ -191,7 +240,7 @@ Deploying to FastAPI Cloud...
`FastAPI` es una clase que hereda directamente de `Starlette`.
-Puedes usar toda la funcionalidad de
Starlette con `FastAPI` también.
+Puedes usar toda la funcionalidad de [Starlette](https://www.starlette.dev/) con `FastAPI` también.
///
@@ -336,7 +385,7 @@ También podrías definirla como una función normal en lugar de `async def`:
/// note | Nota
-Si no sabes la diferencia, Revisa la sección [Async: *"¿Tienes prisa?"*](../async.md#in-a-hurry){.internal-link target=_blank}.
+Si no sabes la diferencia, Revisa la sección [Async: *"¿Tienes prisa?"*](../async.md#in-a-hurry).
///
@@ -352,11 +401,11 @@ Hay muchos otros objetos y modelos que serán automáticamente convertidos a JSO
### Paso 6: Despliégalo { #step-6-deploy-it }
-Despliega tu app en **
FastAPI Cloud** con un solo comando: `fastapi deploy`. 🎉
+Despliega tu app en **[FastAPI Cloud](https://fastapicloud.com)** con un solo comando: `fastapi deploy`. 🎉
#### Sobre FastAPI Cloud { #about-fastapi-cloud }
-**
FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**.
+**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**.
Agiliza el proceso de **construir**, **desplegar** y **acceder** a una API con el mínimo esfuerzo.
diff --git a/docs/es/docs/tutorial/handling-errors.md b/docs/es/docs/tutorial/handling-errors.md
index 265269e874..737c43e41b 100644
--- a/docs/es/docs/tutorial/handling-errors.md
+++ b/docs/es/docs/tutorial/handling-errors.md
@@ -81,7 +81,7 @@ Pero en caso de que los necesites para un escenario avanzado, puedes agregar hea
## Instalar manejadores de excepciones personalizados { #install-custom-exception-handlers }
-Puedes agregar manejadores de excepciones personalizados con
las mismas utilidades de excepciones de Starlette.
+Puedes agregar manejadores de excepciones personalizados con [las mismas utilidades de excepciones de Starlette](https://www.starlette.dev/exceptions/).
Supongamos que tienes una excepción personalizada `UnicornException` que tú (o un paquete que usas) podrías lanzar.
diff --git a/docs/es/docs/tutorial/index.md b/docs/es/docs/tutorial/index.md
index 7804b6854d..414e865b27 100644
--- a/docs/es/docs/tutorial/index.md
+++ b/docs/es/docs/tutorial/index.md
@@ -10,12 +10,12 @@ También está diseñado para funcionar como una referencia futura para que pued
Todos los bloques de código pueden ser copiados y usados directamente (de hecho, son archivos Python probados).
-Para ejecutar cualquiera de los ejemplos, copia el código a un archivo `main.py`, y comienza `fastapi dev` con:
+Para ejecutar cualquiera de los ejemplos, copia el código a un archivo `main.py`, y comienza `fastapi dev`:
```console
-$
fastapi dev
main.py
+$
fastapi dev
FastAPI Starting development server 🚀
@@ -62,7 +62,7 @@ Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al
El primer paso es instalar FastAPI.
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego **instala FastAPI**:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo, y luego **instala FastAPI**:
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]"
/// note | Nota
-Cuando instalas con `pip install "fastapi[standard]"` viene con algunas dependencias opcionales estándar por defecto, incluyendo `fastapi-cloud-cli`, que te permite hacer deploy a
FastAPI Cloud.
+Cuando instalas con `pip install "fastapi[standard]"` viene con algunas dependencias opcionales estándar por defecto, incluyendo `fastapi-cloud-cli`, que te permite hacer deploy a [FastAPI Cloud](https://fastapicloud.com).
Si no quieres tener esas dependencias opcionales, en su lugar puedes instalar `pip install fastapi`.
@@ -84,6 +84,12 @@ Si quieres instalar las dependencias estándar pero sin `fastapi-cloud-cli`, pue
///
+/// tip | Consejo
+
+FastAPI tiene una [extensión oficial para VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (y Cursor), que ofrece muchas funcionalidades, incluyendo un explorador de path operation, búsqueda de path operation, navegación de CodeLens en tests (saltar a la definición desde tests), y deploy y logs de FastAPI Cloud, todo desde tu editor.
+
+///
+
## Guía Avanzada del Usuario { #advanced-user-guide }
También hay una **Guía Avanzada del Usuario** que puedes leer después de esta **Tutorial - Guía del Usuario**.
diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md
index 2163a1cb22..35bc98a26d 100644
--- a/docs/es/docs/tutorial/metadata.md
+++ b/docs/es/docs/tutorial/metadata.md
@@ -14,7 +14,7 @@ Puedes establecer los siguientes campos que se usan en la especificación OpenAP
| `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`. |
| `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` | `dict` | La información de la licencia para la API expuesta. Puede contener varios campos.
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 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. |
|
+| `license_info` | `dict` | La información de la licencia para la API expuesta. Puede contener varios campos.
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. |
|
Puedes configurarlos de la siguiente manera:
@@ -76,7 +76,7 @@ Usa el parámetro `tags` con tus *path operations* (y `APIRouter`s) para asignar
/// info | Información
-Lee más sobre etiquetas en [Configuración de Path Operation](path-operation-configuration.md#tags){.internal-link target=_blank}.
+Lee más sobre etiquetas en [Configuración de Path Operation](path-operation-configuration.md#tags).
///
diff --git a/docs/es/docs/tutorial/middleware.md b/docs/es/docs/tutorial/middleware.md
index 766e30cad6..4729cadc00 100644
--- a/docs/es/docs/tutorial/middleware.md
+++ b/docs/es/docs/tutorial/middleware.md
@@ -15,7 +15,7 @@ Un "middleware" es una función que trabaja con cada **request** antes de que se
Si tienes dependencias con `yield`, el código de salida se ejecutará *después* del middleware.
-Si hubiera tareas en segundo plano (cubiertas en la sección [Tareas en segundo plano](background-tasks.md){.internal-link target=_blank}, lo verás más adelante), se ejecutarán *después* de todo el middleware.
+Si hubiera tareas en segundo plano (cubiertas en la sección [Tareas en segundo plano](background-tasks.md), lo verás más adelante), se ejecutarán *después* de todo el middleware.
///
@@ -35,9 +35,9 @@ La función middleware recibe:
/// tip | Consejo
-Ten en cuenta que los custom proprietary headers se pueden añadir
usando el prefijo `X-`.
+Ten en cuenta que los custom proprietary headers se pueden añadir [usando el prefijo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
-Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) usando el parámetro `expose_headers` documentado en
la documentación de CORS de Starlette.
+Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS ([CORS (Cross-Origin Resource Sharing)](cors.md)) usando el parámetro `expose_headers` documentado en [la documentación de CORS de Starlette](https://www.starlette.dev/middleware/#corsmiddleware).
///
@@ -61,7 +61,7 @@ Por ejemplo, podrías añadir un custom header `X-Process-Time` que contenga el
/// tip | Consejo
-Aquí usamos
`time.perf_counter()` en lugar de `time.time()` porque puede ser más preciso para estos casos de uso. 🤓
+Aquí usamos [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) en lugar de `time.time()` porque puede ser más preciso para estos casos de uso. 🤓
///
@@ -90,6 +90,6 @@ Este comportamiento de apilamiento asegura que los middlewares se ejecuten en un
## Otros middlewares { #other-middlewares }
-Más adelante puedes leer sobre otros middlewares en la [Guía del Usuario Avanzado: Middleware Avanzado](../advanced/middleware.md){.internal-link target=_blank}.
+Más adelante puedes leer sobre otros middlewares en la [Guía del Usuario Avanzado: Middleware Avanzado](../advanced/middleware.md).
Leerás sobre cómo manejar
CORS con un middleware en la siguiente sección.
diff --git a/docs/es/docs/tutorial/path-operation-configuration.md b/docs/es/docs/tutorial/path-operation-configuration.md
index 90e4335b3b..21fd503bb7 100644
--- a/docs/es/docs/tutorial/path-operation-configuration.md
+++ b/docs/es/docs/tutorial/path-operation-configuration.md
@@ -58,7 +58,7 @@ Puedes añadir un `summary` y `description`:
Como las descripciones tienden a ser largas y cubrir múltiples líneas, puedes declarar la descripción de la *path operation* en la
docstring de la función y **FastAPI** la leerá desde allí.
-Puedes escribir
Markdown en el docstring, se interpretará y mostrará correctamente (teniendo en cuenta la indentación del docstring).
+Puedes escribir [Markdown](https://en.wikipedia.org/wiki/Markdown) en el docstring, se interpretará y mostrará correctamente (teniendo en cuenta la indentación del docstring).
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
diff --git a/docs/es/docs/tutorial/path-params-numeric-validations.md b/docs/es/docs/tutorial/path-params-numeric-validations.md
index 3a38d1d63c..5e7b9a9782 100644
--- a/docs/es/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/es/docs/tutorial/path-params-numeric-validations.md
@@ -14,7 +14,7 @@ FastAPI agregó soporte para `Annotated` (y comenzó a recomendar su uso) en la
Si tienes una versión anterior, obtendrás errores al intentar usar `Annotated`.
-Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} a al menos la 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 la 0.95.1 antes de usar `Annotated`.
///
@@ -122,7 +122,7 @@ Y lo mismo para
lt.
## Resumen { #recap }
-Con `Query`, `Path` (y otros que aún no has visto) puedes declarar metadatos y validaciones de string de las mismas maneras que con [Parámetros de Query y Validaciones de String](query-params-str-validations.md){.internal-link target=_blank}.
+Con `Query`, `Path` (y otros que aún no has visto) puedes declarar metadatos y validaciones de string de las mismas maneras que con [Parámetros de Query y Validaciones de String](query-params-str-validations.md).
Y también puedes declarar validaciones numéricas:
diff --git a/docs/es/docs/tutorial/path-params.md b/docs/es/docs/tutorial/path-params.md
index 8dc3db351d..f1aa4ef8b4 100644
--- a/docs/es/docs/tutorial/path-params.md
+++ b/docs/es/docs/tutorial/path-params.md
@@ -6,7 +6,7 @@ Puedes declarar "parámetros" o "variables" de path con la misma sintaxis que se
El valor del parámetro de path `item_id` se pasará a tu función como el argumento `item_id`.
-Así que, si ejecutas este ejemplo y vas a
http://127.0.0.1:8000/items/foo, verás un response de:
+Así que, si ejecutas este ejemplo y vas a [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verás un response de:
```JSON
{"item_id":"foo"}
@@ -28,7 +28,7 @@ Esto te dará soporte del editor dentro de tu función, con chequeo de errores,
##
Conversión de datos { #data-conversion }
-Si ejecutas este ejemplo y abres tu navegador en
http://127.0.0.1:8000/items/3, verás un response de:
+Si ejecutas este ejemplo y abres tu navegador en [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), verás un response de:
```JSON
{"item_id":3}
@@ -44,7 +44,7 @@ Entonces, con esa declaración de tipo, **FastAPI** te ofrece
http://127.0.0.1:8000/items/foo, verás un bonito error HTTP de:
+Pero si vas al navegador en [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verás un bonito error HTTP de:
```JSON
{
@@ -64,7 +64,7 @@ Pero si vas al navegador en http://127.0.0.1:8000/items/4.2
+El mismo error aparecería si proporcionaras un `float` en lugar de un `int`, como en: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
/// check | Revisa
@@ -78,7 +78,7 @@ Esto es increíblemente útil mientras desarrollas y depuras código que interac
## Documentación { #documentation }
-Y cuando abras tu navegador en http://127.0.0.1:8000/docs, verás una documentación de API automática e interactiva como:
+Y cuando abras tu navegador en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), verás una documentación de API automática e interactiva como:
@@ -92,9 +92,9 @@ Nota que el parámetro de path está declarado como un entero.
## Beneficios basados en estándares, documentación alternativa { #standards-based-benefits-alternative-documentation }
-Y porque el esquema generado es del estándar OpenAPI, hay muchas herramientas compatibles.
+Y porque el esquema generado es del estándar [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), hay muchas herramientas compatibles.
-Debido a esto, el propio **FastAPI** proporciona una documentación de API alternativa (usando ReDoc), a la cual puedes acceder en http://127.0.0.1:8000/redoc:
+Debido a esto, el propio **FastAPI** proporciona una documentación de API alternativa (usando ReDoc), a la cual puedes acceder en [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc):
@@ -102,7 +102,7 @@ De la misma manera, hay muchas herramientas compatibles. Incluyendo herramientas
## Pydantic { #pydantic }
-Toda la validación de datos se realiza internamente con Pydantic, así que obtienes todos los beneficios de esta. Y sabes que estás en buenas manos.
+Toda la validación de datos se realiza internamente con [Pydantic](https://docs.pydantic.dev/), así que obtienes todos los beneficios de esta. Y sabes que estás en buenas manos.
Puedes usar las mismas declaraciones de tipo con `str`, `float`, `bool` y muchos otros tipos de datos complejos.
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index b4339e1931..44beba2d3e 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -35,13 +35,13 @@ 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){.internal-link target=_blank} 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 }
-¿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){.internal-link target=_blank}?
+¿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)?
Ahora es el momento de usarlo con FastAPI. 🚀
@@ -158,7 +158,7 @@ Podrías llamar a esa misma función en otros lugares sin FastAPI, y funcionarí
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.
-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. 🚀
+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 }
@@ -296,9 +296,9 @@ También puedes usar `list` directamente en lugar de `list[str]`:
/// note | Nota
-Ten en cuenta que en este caso, FastAPI no comprobará el contenido de la lista.
+Ten en cuenta que en este caso, FastAPI no comprobará el contenido de la list.
-Por ejemplo, `list[int]` comprobaría (y documentaría) que el contenido de la lista son enteros. Pero `list` sola no lo haría.
+Por ejemplo, `list[int]` comprobaría (y documentaría) que el contenido de la list son enteros. Pero `list` sola no lo haría.
///
@@ -370,11 +370,11 @@ Podría haber casos donde necesites hacer alguna validación personalizada que n
En esos casos, puedes usar una función validadora personalizada que se aplique después de la validación normal (por ejemplo, después de validar que el valor es un `str`).
-Puedes lograr eso usando `AfterValidator` de Pydantic dentro de `Annotated`.
+Puedes lograr eso usando [`AfterValidator` de Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`.
/// tip | Consejo
-Pydantic también tiene `BeforeValidator` y otros. 🤓
+Pydantic también tiene [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) y otros. 🤓
///
diff --git a/docs/es/docs/tutorial/query-params.md b/docs/es/docs/tutorial/query-params.md
index edbe51a0ea..2dbb04ef45 100644
--- a/docs/es/docs/tutorial/query-params.md
+++ b/docs/es/docs/tutorial/query-params.md
@@ -182,6 +182,6 @@ En este caso, hay 3 parámetros de query:
/// tip | Consejo
-También podrías usar `Enum`s de la misma manera que con [Parámetros de Path](path-params.md#predefined-values){.internal-link target=_blank}.
+También podrías usar `Enum`s de la misma manera que con [Parámetros de Path](path-params.md#predefined-values).
///
diff --git a/docs/es/docs/tutorial/request-files.md b/docs/es/docs/tutorial/request-files.md
index 717968d741..8bfc7a772e 100644
--- a/docs/es/docs/tutorial/request-files.md
+++ b/docs/es/docs/tutorial/request-files.md
@@ -4,9 +4,9 @@ Puedes definir archivos que serán subidos por el cliente utilizando `File`.
/// info | Información
-Para recibir archivos subidos, primero instala `python-multipart`.
+Para recibir archivos subidos, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo:
```console
$ pip install python-multipart
@@ -63,8 +63,8 @@ Usar `UploadFile` tiene varias ventajas sobre `bytes`:
* Un archivo almacenado en memoria hasta un límite de tamaño máximo, y después de superar este límite, se almacenará en el disco.
* Esto significa que funcionará bien para archivos grandes como imágenes, videos, binarios grandes, etc. sin consumir toda la memoria.
* Puedes obtener metadatos del archivo subido.
-* Tiene una interfaz `async` parecida a un archivo.
-* Expone un objeto Python real `SpooledTemporaryFile` que puedes pasar directamente a otros paquetes que esperan un objeto parecido a un archivo.
+* Tiene una interfaz `async` [parecida a un archivo](https://docs.python.org/3/glossary.html#term-file-like-object).
+* Expone un objeto Python real [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) que puedes pasar directamente a otros paquetes que esperan un objeto parecido a un archivo.
### `UploadFile` { #uploadfile }
@@ -72,7 +72,7 @@ Usar `UploadFile` tiene varias ventajas sobre `bytes`:
* `filename`: Un `str` con el nombre original del archivo que fue subido (por ejemplo, `myimage.jpg`).
* `content_type`: Un `str` con el tipo de contenido (MIME type / media type) (por ejemplo, `image/jpeg`).
-* `file`: Un `SpooledTemporaryFile` (un objeto parecido a un archivo). Este es el objeto de archivo Python real que puedes pasar directamente a otras funciones o paquetes que esperan un objeto "parecido a un archivo".
+* `file`: Un [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (un objeto [parecido a un archivo](https://docs.python.org/3/glossary.html#term-file-like-object)). Este es el objeto de archivo Python real que puedes pasar directamente a otras funciones o paquetes que esperan un objeto "parecido a un archivo".
`UploadFile` tiene los siguientes métodos `async`. Todos ellos llaman a los métodos correspondientes del archivo por debajo (usando el `SpooledTemporaryFile` interno).
@@ -111,7 +111,7 @@ El `UploadFile` de **FastAPI** hereda directamente del `UploadFile` de **Starlet
## Qué es "Form Data" { #what-is-form-data }
-La manera en que los forms de HTML (``) envían los datos al servidor normalmente utiliza una codificación "especial" para esos datos, es diferente de JSON.
+La manera en que los formularios de HTML (``) envían los datos al servidor normalmente utiliza una codificación "especial" para esos datos, es diferente de JSON.
**FastAPI** se asegurará de leer esos datos del lugar correcto en lugar de JSON.
@@ -121,7 +121,7 @@ Los datos de los forms normalmente se codifican usando el "media type" `applicat
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.
-Si deseas leer más sobre estas codificaciones y campos de formularios, dirígete a la MDN web docs para POST.
+Si deseas leer más sobre estas codificaciones y campos de formularios, dirígete a la [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/es/docs/tutorial/request-form-models.md b/docs/es/docs/tutorial/request-form-models.md
index 9afadf0b2e..b20421bd01 100644
--- a/docs/es/docs/tutorial/request-form-models.md
+++ b/docs/es/docs/tutorial/request-form-models.md
@@ -4,9 +4,9 @@ Puedes usar **modelos de Pydantic** para declarar **campos de formulario** en Fa
/// info | Información
-Para usar formularios, primero instala `python-multipart`.
+Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo:
```console
$ pip install python-multipart
diff --git a/docs/es/docs/tutorial/request-forms-and-files.md b/docs/es/docs/tutorial/request-forms-and-files.md
index 738a2bc4b4..f7b5000b7c 100644
--- a/docs/es/docs/tutorial/request-forms-and-files.md
+++ b/docs/es/docs/tutorial/request-forms-and-files.md
@@ -4,9 +4,9 @@ Puedes definir archivos y campos de formulario al mismo tiempo usando `File` y `
/// info | Información
-Para recibir archivos subidos y/o form data, primero instala `python-multipart`.
+Para recibir archivos subidos y/o form data, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo y luego instálalo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo y luego instálalo, por ejemplo:
```console
$ pip install python-multipart
diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md
index cc29296eed..7b78aee69a 100644
--- a/docs/es/docs/tutorial/request-forms.md
+++ b/docs/es/docs/tutorial/request-forms.md
@@ -4,9 +4,9 @@ Cuando necesitas recibir campos de formulario en lugar de JSON, puedes usar `For
/// info | Información
-Para usar formularios, primero instala `python-multipart`.
+Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo:
```console
$ pip install python-multipart
@@ -56,7 +56,7 @@ 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 la MDN web docs para POST.
+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).
///
diff --git a/docs/es/docs/tutorial/response-model.md b/docs/es/docs/tutorial/response-model.md
index c9e931d477..fc9028bee8 100644
--- a/docs/es/docs/tutorial/response-model.md
+++ b/docs/es/docs/tutorial/response-model.md
@@ -13,6 +13,7 @@ FastAPI usará este tipo de retorno para:
* Agregar un **JSON Schema** para el response, en la *path operation* de OpenAPI.
* Esto será utilizado por la **documentación automática**.
* También será utilizado por herramientas de generación automática de código de cliente.
+* **Serializar** los datos devueltos a JSON usando Pydantic, que está escrito en **Rust**, por lo que será **mucho más rápido**.
Pero lo más importante:
@@ -73,9 +74,9 @@ Aquí estamos declarando un modelo `UserIn`, contendrá una contraseña en texto
/// info | Información
-Para usar `EmailStr`, primero instala `email-validator`.
+Para usar `EmailStr`, primero instala [`email-validator`](https://github.com/JoshData/python-email-validator).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo:
```console
$ pip install email-validator
@@ -181,7 +182,7 @@ Podría haber casos en los que devuelvas algo que no es un campo válido de Pyda
### Devolver 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){.internal-link target=_blank}.
+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).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@@ -257,7 +258,7 @@ También puedes usar:
* `response_model_exclude_defaults=True`
* `response_model_exclude_none=True`
-como se describe en la documentación de Pydantic para `exclude_defaults` y `exclude_none`.
+como se describe en [la documentación de Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) para `exclude_defaults` y `exclude_none`.
///
diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md
index 35235eb883..a070819bb1 100644
--- a/docs/es/docs/tutorial/response-status-code.md
+++ b/docs/es/docs/tutorial/response-status-code.md
@@ -20,7 +20,7 @@ El parámetro `status_code` recibe un número con el código de estado HTTP.
/// info | Información
-`status_code` también puede recibir un `IntEnum`, como por ejemplo el `http.HTTPStatus` de Python.
+`status_code` también puede recibir un `IntEnum`, como por ejemplo el [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python.
///
@@ -66,7 +66,7 @@ En breve:
/// tip | Consejo
-Para saber más sobre cada código de estado y qué código es para qué, revisa la documentación de MDN sobre códigos de estado HTTP.
+Para saber más sobre cada código de estado y qué código es para qué, revisa la [documentación de MDN sobre códigos de estado HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).
///
@@ -98,4 +98,4 @@ También podrías usar `from starlette import status`.
## Cambiando el valor por defecto { #changing-the-default }
-Más adelante, en la [Guía de Usuario Avanzada](../advanced/response-change-status-code.md){.internal-link target=_blank}, verás cómo devolver un código de estado diferente al valor por defecto que estás declarando aquí.
+Más adelante, en la [Guía de Usuario Avanzada](../advanced/response-change-status-code.md), verás cómo devolver un código de estado diferente al valor por defecto que estás declarando aquí.
diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md
index 9af8261380..73d0cdbe46 100644
--- a/docs/es/docs/tutorial/schema-extra-example.md
+++ b/docs/es/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Declarar Ejemplos de Request { #declare-request-example-data }
+# Declarar Datos de Ejemplo de Request { #declare-request-example-data }
Puedes declarar ejemplos de los datos que tu aplicación puede recibir.
@@ -12,7 +12,7 @@ Puedes declarar `examples` para un modelo de Pydantic que se añadirá al JSON S
Esa información extra se añadirá tal cual al **JSON Schema** resultante para ese modelo, y se usará en la documentación de la API.
-Puedes usar el atributo `model_config` que toma un `dict` como se describe en la documentación de Pydantic: Configuración.
+Puedes usar el atributo `model_config` que toma un `dict` como se describe en [Documentación de Pydantic: Configuración](https://docs.pydantic.dev/latest/api/config/).
Puedes establecer `"json_schema_extra"` con un `dict` que contenga cualquier dato adicional que te gustaría que aparezca en el JSON Schema generado, incluyendo `examples`.
@@ -145,12 +145,12 @@ JSON Schema no tenía `examples`, así que OpenAPI añadió su propio campo `exa
OpenAPI también añadió los campos `example` y `examples` a otras partes de la especificación:
-* `Parameter Object` (en la especificación) que era usado por FastAPI:
+* [`Parameter Object` (en la especificación)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object) que era usado por FastAPI:
* `Path()`
* `Query()`
* `Header()`
* `Cookie()`
-* `Request Body Object`, en el campo `content`, sobre el `Media Type Object` (en la especificación) que era usado por FastAPI:
+* [`Request Body Object`, en el campo `content`, sobre el `Media Type Object` (en la especificación)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object) que era usado por FastAPI:
* `Body()`
* `File()`
* `Form()`
@@ -163,7 +163,7 @@ Este viejo parámetro `examples` específico de OpenAPI ahora es `openapi_exampl
### Campo `examples` de JSON Schema { #json-schemas-examples-field }
-Pero luego JSON Schema añadió un campo `examples` a una nueva versión de la especificación.
+Pero luego JSON Schema añadió un [campo `examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) a una nueva versión de la especificación.
Y entonces el nuevo OpenAPI 3.1.0 se basó en la última versión (JSON Schema 2020-12) que incluía este nuevo campo `examples`.
diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md
index 909f14765c..8118906e5d 100644
--- a/docs/es/docs/tutorial/security/first-steps.md
+++ b/docs/es/docs/tutorial/security/first-steps.md
@@ -26,11 +26,11 @@ Copia el ejemplo en un archivo `main.py`:
/// info | Información
-El paquete `python-multipart` se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`.
+El paquete [`python-multipart`](https://github.com/Kludex/python-multipart) se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`.
Sin embargo, si usas el comando `pip install fastapi`, el paquete `python-multipart` no se incluye por defecto.
-Para instalarlo manualmente, asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo con:
+Para instalarlo manualmente, asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo, y luego instalarlo con:
```console
$ pip install python-multipart
@@ -45,7 +45,7 @@ Ejecuta el ejemplo con:
```console
-$ fastapi dev main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -54,7 +54,7 @@ $ fastapi dev main.py
## Revisa { #check-it }
-Ve a la documentación interactiva en:
http://127.0.0.1:8000/docs.
+Ve a la documentación interactiva en: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Verás algo así:
@@ -140,7 +140,7 @@ Aquí `tokenUrl="token"` se refiere a una URL relativa `token` que aún no hemos
Porque estamos usando una URL relativa, si tu API estuviera ubicada en `https://example.com/`, entonces se referiría a `https://example.com/token`. Pero si tu API estuviera ubicada en `https://example.com/api/v1/`, entonces se referiría a `https://example.com/api/v1/token`.
-Usar una URL relativa es importante para asegurarse de que tu aplicación siga funcionando incluso en un caso de uso avanzado como [Detrás de un Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}.
+Usar una URL relativa es importante para asegurarse de que tu aplicación siga funcionando incluso en un caso de uso avanzado como [Detrás de un Proxy](../../advanced/behind-a-proxy.md).
///
diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md
index e481fb6462..af1140d1ba 100644
--- a/docs/es/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/es/docs/tutorial/security/oauth2-jwt.md
@@ -24,13 +24,13 @@ De esta manera, puedes crear un token con una expiración de, digamos, 1 semana.
Después de una semana, el token estará expirado y el usuario no estará autorizado y tendrá que iniciar sesión nuevamente para obtener un nuevo token. Y si el usuario (o un tercero) intenta modificar el token para cambiar la expiración, podrás descubrirlo, porque las firmas no coincidirían.
-Si quieres jugar con tokens JWT y ver cómo funcionan, revisa
https://jwt.io.
+Si quieres jugar con tokens JWT y ver cómo funcionan, revisa [https://jwt.io](https://jwt.io/).
## Instalar `PyJWT` { #install-pyjwt }
Necesitamos instalar `PyJWT` para generar y verificar los tokens JWT en Python.
-Asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalar `pyjwt`:
+Asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo y luego instalar `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt
Si planeas usar algoritmos de firma digital como RSA o ECDSA, deberías instalar la dependencia del paquete de criptografía `pyjwt[crypto]`.
-Puedes leer más al respecto en la
documentación de instalación de PyJWT.
+Puedes leer más al respecto en la [documentación de instalación de PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html).
///
@@ -72,7 +72,7 @@ Soporta muchos algoritmos de hashing seguros y utilidades para trabajar con ello
El algoritmo recomendado es "Argon2".
-Asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalar pwdlib con Argon2:
+Asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo y luego instalar pwdlib con Argon2:
@@ -200,7 +200,7 @@ Lo importante a tener en cuenta es que la clave `sub` debería tener un identifi
## Revisa { #check-it }
-Ejecuta el servidor y ve a la documentación:
http://127.0.0.1:8000/docs.
+Ejecuta el servidor y ve a la documentación: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Verás la interfaz de usuario como:
diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md
index ac3d9e2975..15c7146bd7 100644
--- a/docs/es/docs/tutorial/security/simple-oauth2.md
+++ b/docs/es/docs/tutorial/security/simple-oauth2.md
@@ -146,7 +146,7 @@ UserInDB(
/// info | Información
-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){.internal-link target=_blank}.
+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).
///
@@ -216,7 +216,7 @@ Ese es el beneficio de los estándares...
## Verlo en acción { #see-it-in-action }
-Abre la documentación interactiva:
http://127.0.0.1:8000/docs.
+Abre la documentación interactiva: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### Autenticar { #authenticate }
diff --git a/docs/es/docs/tutorial/sql-databases.md b/docs/es/docs/tutorial/sql-databases.md
index b57ebdbbe5..7131716ee8 100644
--- a/docs/es/docs/tutorial/sql-databases.md
+++ b/docs/es/docs/tutorial/sql-databases.md
@@ -2,9 +2,9 @@
**FastAPI** no requiere que uses una base de datos SQL (relacional). Pero puedes utilizar **cualquier base de datos** que desees.
-Aquí veremos un ejemplo usando
SQLModel.
+Aquí veremos un ejemplo usando [SQLModel](https://sqlmodel.tiangolo.com/).
-**SQLModel** está construido sobre
SQLAlchemy y Pydantic. Fue creado por el mismo autor de **FastAPI** para ser la combinación perfecta para aplicaciones de FastAPI que necesiten usar **bases de datos SQL**.
+**SQLModel** está construido sobre [SQLAlchemy](https://www.sqlalchemy.org/) y Pydantic. Fue creado por el mismo autor de **FastAPI** para ser la combinación perfecta para aplicaciones de FastAPI que necesiten usar **bases de datos SQL**.
/// tip | Consejo
@@ -26,15 +26,15 @@ Más adelante, para tu aplicación en producción, es posible que desees usar un
/// tip | Consejo
-Hay un generador de proyectos oficial con **FastAPI** y **PostgreSQL** que incluye un frontend y más herramientas:
https://github.com/fastapi/full-stack-fastapi-template
+Hay un generador de proyectos oficial con **FastAPI** y **PostgreSQL** que incluye un frontend y más herramientas: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)
///
-Este es un tutorial muy simple y corto, si deseas aprender sobre bases de datos en general, sobre SQL o más funcionalidades avanzadas, ve a la
documentación de SQLModel.
+Este es un tutorial muy simple y corto, si deseas aprender sobre bases de datos en general, sobre SQL o más funcionalidades avanzadas, ve a la [documentación de SQLModel](https://sqlmodel.tiangolo.com/).
## Instalar `SQLModel` { #install-sqlmodel }
-Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego instala `sqlmodel`:
+Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md), actívalo, y luego instala `sqlmodel`:
@@ -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 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.
@@ -111,7 +111,7 @@ Para producción probablemente usarías un script de migración que se ejecuta a
/// tip | Consejo
-SQLModel tendrá utilidades de migración envolviendo Alembic, pero por ahora, puedes usar
Alembic directamente.
+SQLModel tendrá utilidades de migración envolviendo Alembic, pero por ahora, puedes usar [Alembic](https://alembic.sqlalchemy.org/en/latest/) directamente.
///
@@ -152,7 +152,7 @@ Puedes ejecutar la aplicación:
```console
-$ fastapi dev main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -337,7 +337,7 @@ Puedes ejecutar la aplicación de nuevo:
```console
-$ fastapi dev main.py
+$ fastapi dev
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
@@ -352,6 +352,6 @@ Si vas a la interfaz de `/docs` de la API, verás que ahora está actualizada, y
## Resumen { #recap }
-Puedes usar
**SQLModel** para interactuar con una base de datos SQL y simplificar el código con *modelos de datos* y *modelos de tablas*.
+Puedes usar [**SQLModel**](https://sqlmodel.tiangolo.com/) para interactuar con una base de datos SQL y simplificar el código con *modelos de datos* y *modelos de tablas*.
-Puedes aprender mucho más en la documentación de **SQLModel**, hay un mini
tutorial más largo sobre el uso de SQLModel con **FastAPI**. 🚀
+Puedes aprender mucho más en la documentación de **SQLModel**, hay un mini [tutorial más largo sobre el uso de SQLModel con **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀
diff --git a/docs/es/docs/tutorial/static-files.md b/docs/es/docs/tutorial/static-files.md
index 84d2e94a97..b99ed5f9c4 100644
--- a/docs/es/docs/tutorial/static-files.md
+++ b/docs/es/docs/tutorial/static-files.md
@@ -23,7 +23,7 @@ También podrías usar `from starlette.staticfiles import StaticFiles`.
Esto es diferente a usar un `APIRouter`, ya que una aplicación montada es completamente independiente. El OpenAPI y la documentación de tu aplicación principal no incluirán nada de la aplicación montada, etc.
-Puedes leer más sobre esto en la [Guía de Usuario Avanzada](../advanced/index.md){.internal-link target=_blank}.
+Puedes leer más sobre esto en la [Guía de Usuario Avanzada](../advanced/index.md).
## Detalles { #details }
@@ -37,4 +37,4 @@ Todos estos parámetros pueden ser diferentes a "`static`", ajústalos según la
## Más info { #more-info }
-Para más detalles y opciones revisa
la documentación de Starlette sobre Archivos Estáticos.
+Para más detalles y opciones revisa [la documentación de Starlette sobre Archivos Estáticos](https://www.starlette.dev/staticfiles/).
diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md
index c477129035..a40d90c5ee 100644
--- a/docs/es/docs/tutorial/testing.md
+++ b/docs/es/docs/tutorial/testing.md
@@ -1,18 +1,18 @@
# Testing { #testing }
-Gracias a
Starlette, escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable.
+Gracias a [Starlette](https://www.starlette.dev/testclient/), escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable.
-Está basado en
HTTPX, que a su vez está diseñado basado en Requests, por lo que es muy familiar e intuitivo.
+Está basado en [HTTPX](https://www.python-httpx.org), que a su vez está diseñado basado en Requests, por lo que es muy familiar e intuitivo.
-Con él, puedes usar
pytest directamente con **FastAPI**.
+Con él, puedes usar [pytest](https://docs.pytest.org/) directamente con **FastAPI**.
## Usando `TestClient` { #using-testclient }
/// info | Información
-Para usar `TestClient`, primero instala
`httpx`.
+Para usar `TestClient`, primero instala [`httpx`](https://www.python-httpx.org).
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo:
```console
$ pip install httpx
@@ -42,7 +42,7 @@ Esto te permite usar `pytest` directamente sin complicaciones.
///
-/// note | Nota Técnica
+/// note | Detalles técnicos
También podrías usar `from starlette.testclient import TestClient`.
@@ -52,7 +52,7 @@ También podrías usar `from starlette.testclient import TestClient`.
/// tip | Consejo
-Si quieres llamar a funciones `async` en tus pruebas además de enviar requests a tu aplicación FastAPI (por ejemplo, funciones asincrónicas de bases de datos), echa un vistazo a las [Pruebas Asincrónicas](../advanced/async-tests.md){.internal-link target=_blank} en el tutorial avanzado.
+Si quieres llamar a funciones `async` en tus pruebas además de enviar requests a tu aplicación FastAPI (por ejemplo, funciones asincrónicas de bases de datos), echa un vistazo a las [Pruebas Asincrónicas](../advanced/async-tests.md) en el tutorial avanzado.
///
@@ -64,7 +64,7 @@ Y tu aplicación de **FastAPI** también podría estar compuesta de varios archi
### Archivo de aplicación **FastAPI** { #fastapi-app-file }
-Digamos que tienes una estructura de archivos como se describe en [Aplicaciones Más Grandes](bigger-applications.md){.internal-link target=_blank}:
+Digamos que tienes una estructura de archivos como se describe en [Aplicaciones Más Grandes](bigger-applications.md):
```
.
@@ -75,6 +75,7 @@ Digamos que tienes una estructura de archivos como se describe en [Aplicaciones
En el archivo `main.py` tienes tu aplicación de **FastAPI**:
+
{* ../../docs_src/app_testing/app_a_py310/main.py *}
### Archivo de prueba { #testing-file }
@@ -139,13 +140,13 @@ Por ejemplo:
* Para pasar *headers*, usa un `dict` en el parámetro `headers`.
* Para *cookies*, un `dict` en el parámetro `cookies`.
-Para más información sobre cómo pasar datos al backend (usando `httpx` o el `TestClient`) revisa la
documentación de HTTPX.
+Para más información sobre cómo pasar datos al backend (usando `httpx` o el `TestClient`) revisa la [documentación de HTTPX](https://www.python-httpx.org).
/// info | Información
Ten en cuenta que el `TestClient` recibe datos que pueden ser convertidos a JSON, no modelos de Pydantic.
-Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la aplicación durante las pruebas, puedes usar el `jsonable_encoder` descrito en [Codificador Compatible con JSON](encoder.md){.internal-link target=_blank}.
+Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la aplicación durante las pruebas, puedes usar el `jsonable_encoder` descrito en [Codificador Compatible con JSON](encoder.md).
///
@@ -153,7 +154,7 @@ Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la apl
Después de eso, solo necesitas instalar `pytest`.
-Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo:
+Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo:
diff --git a/docs/es/docs/virtual-environments.md b/docs/es/docs/virtual-environments.md
index f8839ac6c3..682f9e947c 100644
--- a/docs/es/docs/virtual-environments.md
+++ b/docs/es/docs/virtual-environments.md
@@ -22,7 +22,7 @@ Un **entorno virtual** es un directorio con algunos archivos en él.
Esta página te enseñará cómo usar **entornos virtuales** y cómo funcionan.
-Si estás listo para adoptar una **herramienta que gestiona todo** por ti (incluyendo la instalación de Python), prueba
uv.
+Si estás listo para adoptar una **herramienta que gestiona todo** por ti (incluyendo la instalación de Python), prueba [uv](https://github.com/astral-sh/uv).
///
@@ -86,7 +86,7 @@ $ python -m venv .venv
//// tab | `uv`
-Si tienes instalado
`uv`, puedes usarlo para crear un entorno virtual.
+Si tienes instalado [`uv`](https://github.com/astral-sh/uv), puedes usarlo para crear un entorno virtual.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1
//// tab | Windows Bash
-O si usas Bash para Windows (por ejemplo,
Git Bash):
+O si usas Bash para Windows (por ejemplo, [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ Si muestra el binario de `python` en `.venv\Scripts\python`, dentro de tu proyec
/// tip | Consejo
-Si usas
`uv` usarías eso para instalar cosas en lugar de `pip`, por lo que no necesitas actualizar `pip`. 😎
+Si usas [`uv`](https://github.com/astral-sh/uv) usarías eso para instalar cosas en lugar de `pip`, por lo que no necesitas actualizar `pip`. 😎
///
@@ -268,7 +268,7 @@ Si estás usando **Git** (deberías), añade un archivo `.gitignore` para exclui
/// tip | Consejo
-Si usaste
`uv` para crear el entorno virtual, ya lo hizo por ti, puedes saltarte este paso. 😎
+Si usaste [`uv`](https://github.com/astral-sh/uv) para crear el entorno virtual, ya lo hizo por ti, puedes saltarte este paso. 😎
///
@@ -340,7 +340,7 @@ $ pip install "fastapi[standard]"
//// tab | `uv`
-Si tienes
`uv`:
+Si tienes [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt
//// tab | `uv`
-Si tienes
`uv`:
+Si tienes [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Probablemente usarías un editor, asegúrate de configurarlo para que use el mis
Por ejemplo:
-*
VS Code
-*
PyCharm
+* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
+* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
/// tip | Consejo
@@ -453,7 +453,7 @@ Continúa leyendo. 👇🤓
## Por qué Entornos Virtuales { #why-virtual-environments }
-Para trabajar con FastAPI necesitas instalar
Python.
+Para trabajar con FastAPI necesitas instalar [Python](https://www.python.org/).
Después de eso, necesitarías **instalar** FastAPI y cualquier otro **paquete** que desees usar.
@@ -562,7 +562,7 @@ $ pip install "fastapi[standard]"
-Eso descargará un archivo comprimido con el código de FastAPI, normalmente desde
PyPI.
+Eso descargará un archivo comprimido con el código de FastAPI, normalmente desde [PyPI](https://pypi.org/project/fastapi/).
También **descargará** archivos para otros paquetes de los que depende FastAPI.
@@ -625,7 +625,7 @@ $ .venv\Scripts\Activate.ps1
//// tab | Windows Bash
-O si usas Bash para Windows (por ejemplo,
Git Bash):
+O si usas Bash para Windows (por ejemplo, [Git Bash](https://gitforwindows.org/)):
@@ -637,13 +637,13 @@ $ source .venv/Scripts/activate
////
-Ese comando creará o modificará algunas [variables de entorno](environment-variables.md){.internal-link target=_blank} que estarán disponibles para los siguientes comandos.
+Ese comando creará o modificará algunas [variables de entorno](environment-variables.md) que estarán disponibles para los siguientes comandos.
Una de esas variables es la variable `PATH`.
/// tip | Consejo
-Puedes aprender más sobre la variable de entorno `PATH` en la sección [Variables de Entorno](environment-variables.md#path-environment-variable){.internal-link target=_blank}.
+Puedes aprender más sobre la variable de entorno `PATH` en la sección [Variables de Entorno](environment-variables.md#path-environment-variable).
///
@@ -844,7 +844,7 @@ Esta es una guía simple para comenzar y enseñarte cómo funciona todo **por de
Hay muchas **alternativas** para gestionar entornos virtuales, dependencias de paquetes (requisitos), proyectos.
-Una vez que estés listo y quieras usar una herramienta para **gestionar todo el proyecto**, dependencias de paquetes, entornos virtuales, etc. Te sugeriría probar
uv.
+Una vez que estés listo y quieras usar una herramienta para **gestionar todo el proyecto**, dependencias de paquetes, entornos virtuales, etc. Te sugeriría probar [uv](https://github.com/astral-sh/uv).
`uv` puede hacer muchas cosas, puede: