Browse Source

Update Spanish translations

pull/14510/head
Yurii Motov 7 months ago
parent
commit
eb9712f3ec
  1. 4
      docs/es/docs/advanced/additional-responses.md
  2. 8
      docs/es/docs/advanced/async-tests.md
  3. 12
      docs/es/docs/advanced/behind-a-proxy.md
  4. 32
      docs/es/docs/advanced/custom-response.md
  5. 12
      docs/es/docs/advanced/events.md
  6. 2
      docs/es/docs/advanced/generate-clients.md
  7. 6
      docs/es/docs/advanced/middleware.md
  8. 2
      docs/es/docs/advanced/openapi-webhooks.md
  9. 10
      docs/es/docs/advanced/path-operation-advanced-configuration.md
  10. 2
      docs/es/docs/advanced/response-change-status-code.md
  11. 4
      docs/es/docs/advanced/response-cookies.md
  12. 2
      docs/es/docs/advanced/response-directly.md
  13. 4
      docs/es/docs/advanced/response-headers.md
  14. 10
      docs/es/docs/advanced/settings.md
  15. 6
      docs/es/docs/advanced/sub-applications.md
  16. 2
      docs/es/docs/advanced/templates.md
  17. 4
      docs/es/docs/advanced/testing-events.md
  18. 2
      docs/es/docs/advanced/testing-websockets.md
  19. 2
      docs/es/docs/advanced/using-request-directly.md
  20. 6
      docs/es/docs/advanced/websockets.md
  21. 2
      docs/es/docs/advanced/wsgi.md
  22. 2
      docs/es/docs/how-to/conditional-openapi.md
  23. 6
      docs/es/docs/how-to/configure-swagger-ui.md
  24. 14
      docs/es/docs/how-to/custom-docs-ui-assets.md
  25. 10
      docs/es/docs/how-to/extending-openapi.md
  26. 2
      docs/es/docs/how-to/graphql.md
  27. 164
      docs/es/docs/python-types.md
  28. 6
      docs/es/docs/tutorial/background-tasks.md
  29. 30
      docs/es/docs/tutorial/body-nested-models.md
  30. 2
      docs/es/docs/tutorial/cors.md
  31. 2
      docs/es/docs/tutorial/debugging.md
  32. 10
      docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
  33. 2
      docs/es/docs/tutorial/dependencies/global-dependencies.md
  34. 14
      docs/es/docs/tutorial/first-steps.md
  35. 16
      docs/es/docs/tutorial/handling-errors.md
  36. 12
      docs/es/docs/tutorial/metadata.md
  37. 4
      docs/es/docs/tutorial/middleware.md
  38. 4
      docs/es/docs/tutorial/path-operation-configuration.md
  39. 4
      docs/es/docs/tutorial/path-params-numeric-validations.md
  40. 26
      docs/es/docs/tutorial/path-params.md
  41. 4
      docs/es/docs/tutorial/query-params.md
  42. 4
      docs/es/docs/tutorial/response-model.md
  43. 6
      docs/es/docs/tutorial/response-status-code.md
  44. 2
      docs/es/docs/tutorial/static-files.md
  45. 6
      docs/es/docs/tutorial/testing.md

4
docs/es/docs/advanced/additional-responses.md

@ -26,7 +26,7 @@ Cada uno de esos `dict`s de response puede tener una clave `model`, conteniendo
Por ejemplo, para declarar otro response con un código de estado `404` y un modelo Pydantic `Message`, puedes escribir: Por ejemplo, para declarar otro response con un código de estado `404` y un modelo Pydantic `Message`, puedes escribir:
{* ../../docs_src/additional_responses/tutorial001.py hl[18,22] *} {* ../../docs_src/additional_responses/tutorial001_py39.py hl[18,22] *}
/// note | Nota /// note | Nota
@ -203,7 +203,7 @@ Por ejemplo, puedes declarar un response con un código de estado `404` que usa
Y un response con un código de estado `200` que usa tu `response_model`, pero incluye un `example` personalizado: Y un response con un código de estado `200` que usa tu `response_model`, pero incluye un `example` personalizado:
{* ../../docs_src/additional_responses/tutorial003.py hl[20:31] *} {* ../../docs_src/additional_responses/tutorial003_py39.py hl[20:31] *}
Todo se combinará e incluirá en tu OpenAPI, y se mostrará en la documentación de la API: Todo se combinará e incluirá en tu OpenAPI, y se mostrará en la documentación de la API:

8
docs/es/docs/advanced/async-tests.md

@ -32,11 +32,11 @@ Para un ejemplo simple, consideremos una estructura de archivos similar a la des
El archivo `main.py` tendría: El archivo `main.py` tendría:
{* ../../docs_src/async_tests/main.py *} {* ../../docs_src/async_tests/app_a_py39/main.py *}
El archivo `test_main.py` tendría los tests para `main.py`, podría verse así ahora: El archivo `test_main.py` tendría los tests para `main.py`, podría verse así ahora:
{* ../../docs_src/async_tests/test_main.py *} {* ../../docs_src/async_tests/app_a_py39/test_main.py *}
## Ejecútalo { #run-it } ## Ejecútalo { #run-it }
@ -56,7 +56,7 @@ $ pytest
El marcador `@pytest.mark.anyio` le dice a pytest que esta función de test debe ser llamada asíncronamente: El marcador `@pytest.mark.anyio` le dice a pytest que esta función de test debe ser llamada asíncronamente:
{* ../../docs_src/async_tests/test_main.py hl[7] *} {* ../../docs_src/async_tests/app_a_py39/test_main.py hl[7] *}
/// tip | Consejo /// tip | Consejo
@ -66,7 +66,7 @@ Nota que la función de test ahora es `async def` en lugar de solo `def` como an
Luego podemos crear un `AsyncClient` con la app y enviar requests asíncronos a ella, usando `await`. Luego podemos crear un `AsyncClient` con la app y enviar requests asíncronos a ella, usando `await`.
{* ../../docs_src/async_tests/test_main.py hl[9:12] *} {* ../../docs_src/async_tests/app_a_py39/test_main.py hl[9:12] *}
Esto es equivalente a: Esto es equivalente a:

12
docs/es/docs/advanced/behind-a-proxy.md

@ -44,7 +44,7 @@ $ fastapi run --forwarded-allow-ips="*"
Por ejemplo, digamos que defines una *path operation* `/items/`: Por ejemplo, digamos que defines una *path operation* `/items/`:
{* ../../docs_src/behind_a_proxy/tutorial001_01.py hl[6] *} {* ../../docs_src/behind_a_proxy/tutorial001_01_py39.py hl[6] *}
Si el cliente intenta ir a `/items`, por defecto, sería redirigido a `/items/`. Si el cliente intenta ir a `/items`, por defecto, sería redirigido a `/items/`.
@ -115,7 +115,7 @@ En este caso, el path original `/app` realmente sería servido en `/api/v1/app`.
Aunque todo tu código esté escrito asumiendo que solo existe `/app`. Aunque todo tu código esté escrito asumiendo que solo existe `/app`.
{* ../../docs_src/behind_a_proxy/tutorial001.py hl[6] *} {* ../../docs_src/behind_a_proxy/tutorial001_py39.py hl[6] *}
Y el proxy estaría **"eliminando"** el **prefijo del path** sobre la marcha antes de transmitir el request al servidor de aplicaciones (probablemente Uvicorn a través de FastAPI CLI), manteniendo a tu aplicación convencida de que está siendo servida en `/app`, así que no tienes que actualizar todo tu código para incluir el prefijo `/api/v1`. Y el proxy estaría **"eliminando"** el **prefijo del path** sobre la marcha antes de transmitir el request al servidor de aplicaciones (probablemente Uvicorn a través de FastAPI CLI), manteniendo a tu aplicación convencida de que está siendo servida en `/app`, así que no tienes que actualizar todo tu código para incluir el prefijo `/api/v1`.
@ -193,7 +193,7 @@ Puedes obtener el `root_path` actual utilizado por tu aplicación para cada requ
Aquí lo estamos incluyendo en el mensaje solo con fines de demostración. Aquí lo estamos incluyendo en el mensaje solo con fines de demostración.
{* ../../docs_src/behind_a_proxy/tutorial001.py hl[8] *} {* ../../docs_src/behind_a_proxy/tutorial001_py39.py hl[8] *}
Luego, si inicias Uvicorn con: Luego, si inicias Uvicorn con:
@ -220,7 +220,7 @@ El response sería algo como:
Alternativamente, si no tienes una forma de proporcionar una opción de línea de comandos como `--root-path` o su equivalente, puedes configurar el parámetro `root_path` al crear tu app de FastAPI: Alternativamente, si no tienes una forma de proporcionar una opción de línea de comandos como `--root-path` o su equivalente, puedes configurar el parámetro `root_path` al crear tu app de FastAPI:
{* ../../docs_src/behind_a_proxy/tutorial002.py hl[3] *} {* ../../docs_src/behind_a_proxy/tutorial002_py39.py hl[3] *}
Pasar el `root_path` a `FastAPI` sería el equivalente a pasar la opción de línea de comandos `--root-path` a Uvicorn o Hypercorn. Pasar el `root_path` a `FastAPI` sería el equivalente a pasar la opción de línea de comandos `--root-path` a Uvicorn o Hypercorn.
@ -400,7 +400,7 @@ Si pasas una lista personalizada de `servers` y hay un `root_path` (porque tu AP
Por ejemplo: Por ejemplo:
{* ../../docs_src/behind_a_proxy/tutorial003.py hl[4:7] *} {* ../../docs_src/behind_a_proxy/tutorial003_py39.py hl[4:7] *}
Generará un esquema de OpenAPI como: Generará un esquema de OpenAPI como:
@ -455,7 +455,7 @@ Si no especificas el parámetro `servers` y `root_path` es igual a `/`, la propi
Si no quieres que **FastAPI** incluya un server automático usando el `root_path`, puedes usar el parámetro `root_path_in_servers=False`: Si no quieres que **FastAPI** incluya un server automático usando el `root_path`, puedes usar el parámetro `root_path_in_servers=False`:
{* ../../docs_src/behind_a_proxy/tutorial004.py hl[9] *} {* ../../docs_src/behind_a_proxy/tutorial004_py39.py hl[9] *}
y entonces no lo incluirá en el esquema de OpenAPI. y entonces no lo incluirá en el esquema de OpenAPI.

32
docs/es/docs/advanced/custom-response.md

@ -30,7 +30,7 @@ Esto se debe a que, por defecto, FastAPI inspeccionará cada elemento dentro y s
Pero si estás seguro de que el contenido que estás devolviendo es **serializable con JSON**, puedes pasarlo directamente a la clase de response y evitar la sobrecarga extra que FastAPI tendría al pasar tu contenido de retorno a través de `jsonable_encoder` antes de pasarlo a la clase de response. Pero si estás seguro de que el contenido que estás devolviendo es **serializable con JSON**, puedes pasarlo directamente a la clase de response y evitar la sobrecarga extra que FastAPI tendría al pasar tu contenido de retorno a través de `jsonable_encoder` antes de pasarlo a la clase de response.
{* ../../docs_src/custom_response/tutorial001b.py hl[2,7] *} {* ../../docs_src/custom_response/tutorial001b_py39.py hl[2,7] *}
/// info | Información /// info | Información
@ -55,7 +55,7 @@ Para devolver un response con HTML directamente desde **FastAPI**, usa `HTMLResp
* Importa `HTMLResponse`. * Importa `HTMLResponse`.
* Pasa `HTMLResponse` como parámetro `response_class` de tu *path operation decorator*. * Pasa `HTMLResponse` como parámetro `response_class` de tu *path operation decorator*.
{* ../../docs_src/custom_response/tutorial002.py hl[2,7] *} {* ../../docs_src/custom_response/tutorial002_py39.py hl[2,7] *}
/// info | Información /// info | Información
@ -73,7 +73,7 @@ Como se ve en [Devolver una Response directamente](response-directly.md){.intern
El mismo ejemplo de arriba, devolviendo una `HTMLResponse`, podría verse así: El mismo ejemplo de arriba, devolviendo una `HTMLResponse`, podría verse así:
{* ../../docs_src/custom_response/tutorial003.py hl[2,7,19] *} {* ../../docs_src/custom_response/tutorial003_py39.py hl[2,7,19] *}
/// warning | Advertencia /// warning | Advertencia
@ -97,7 +97,7 @@ El `response_class` solo se usará para documentar el OpenAPI *path operation*,
Por ejemplo, podría ser algo así: Por ejemplo, podría ser algo así:
{* ../../docs_src/custom_response/tutorial004.py hl[7,21,23] *} {* ../../docs_src/custom_response/tutorial004_py39.py hl[7,21,23] *}
En este ejemplo, la función `generate_html_response()` ya genera y devuelve una `Response` en lugar de devolver el HTML en un `str`. En este ejemplo, la función `generate_html_response()` ya genera y devuelve una `Response` en lugar de devolver el HTML en un `str`.
@ -136,7 +136,7 @@ Acepta los siguientes parámetros:
FastAPI (de hecho Starlette) incluirá automáticamente un header Content-Length. También incluirá un header Content-Type, basado en el `media_type` y añadiendo un conjunto de caracteres para tipos de texto. FastAPI (de hecho Starlette) incluirá automáticamente un header Content-Length. También incluirá un header Content-Type, basado en el `media_type` y añadiendo un conjunto de caracteres para tipos de texto.
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *} {* ../../docs_src/response_directly/tutorial002_py39.py hl[1,18] *}
### `HTMLResponse` { #htmlresponse } ### `HTMLResponse` { #htmlresponse }
@ -146,7 +146,7 @@ Toma algún texto o bytes y devuelve un response HTML, como leíste arriba.
Toma algún texto o bytes y devuelve un response de texto plano. Toma algún texto o bytes y devuelve un response de texto plano.
{* ../../docs_src/custom_response/tutorial005.py hl[2,7,9] *} {* ../../docs_src/custom_response/tutorial005_py39.py hl[2,7,9] *}
### `JSONResponse` { #jsonresponse } ### `JSONResponse` { #jsonresponse }
@ -180,7 +180,7 @@ Esto requiere instalar `ujson`, por ejemplo, con `pip install ujson`.
/// ///
{* ../../docs_src/custom_response/tutorial001.py hl[2,7] *} {* ../../docs_src/custom_response/tutorial001_py39.py hl[2,7] *}
/// tip | Consejo /// tip | Consejo
@ -194,13 +194,13 @@ Devuelve una redirección HTTP. Usa un código de estado 307 (Redirección Tempo
Puedes devolver un `RedirectResponse` directamente: Puedes devolver un `RedirectResponse` directamente:
{* ../../docs_src/custom_response/tutorial006.py hl[2,9] *} {* ../../docs_src/custom_response/tutorial006_py39.py hl[2,9] *}
--- ---
O puedes usarlo en el parámetro `response_class`: O puedes usarlo en el parámetro `response_class`:
{* ../../docs_src/custom_response/tutorial006b.py hl[2,7,9] *} {* ../../docs_src/custom_response/tutorial006b_py39.py hl[2,7,9] *}
Si haces eso, entonces puedes devolver la URL directamente desde tu *path operation function*. Si haces eso, entonces puedes devolver la URL directamente desde tu *path operation function*.
@ -210,13 +210,13 @@ En este caso, el `status_code` utilizado será el por defecto para `RedirectResp
También puedes usar el parámetro `status_code` combinado con el parámetro `response_class`: También puedes usar el parámetro `status_code` combinado con el parámetro `response_class`:
{* ../../docs_src/custom_response/tutorial006c.py hl[2,7,9] *} {* ../../docs_src/custom_response/tutorial006c_py39.py hl[2,7,9] *}
### `StreamingResponse` { #streamingresponse } ### `StreamingResponse` { #streamingresponse }
Toma un generador `async` o un generador/iterador normal y transmite el cuerpo del response. Toma un generador `async` o un generador/iterador normal y transmite el cuerpo del response.
{* ../../docs_src/custom_response/tutorial007.py hl[2,14] *} {* ../../docs_src/custom_response/tutorial007_py39.py hl[2,14] *}
#### Usando `StreamingResponse` con objetos similares a archivos { #using-streamingresponse-with-file-like-objects } #### Usando `StreamingResponse` con objetos similares a archivos { #using-streamingresponse-with-file-like-objects }
@ -226,7 +226,7 @@ De esa manera, no tienes que leerlo todo primero en memoria, y puedes pasar esa
Esto incluye muchos paquetes para interactuar con almacenamiento en la nube, procesamiento de video y otros. Esto incluye muchos paquetes para interactuar con almacenamiento en la nube, procesamiento de video y otros.
{* ../../docs_src/custom_response/tutorial008.py hl[2,10:12,14] *} {* ../../docs_src/custom_response/tutorial008_py39.py hl[2,10:12,14] *}
1. Esta es la función generadora. Es una "función generadora" porque contiene declaraciones `yield` dentro. 1. Esta es la función generadora. Es una "función generadora" porque contiene declaraciones `yield` dentro.
2. Al usar un bloque `with`, nos aseguramos de que el objeto similar a un archivo se cierre después de que la función generadora termine. Así, después de que termina de enviar el response. 2. Al usar un bloque `with`, nos aseguramos de que el objeto similar a un archivo se cierre después de que la función generadora termine. Así, después de que termina de enviar el response.
@ -255,11 +255,11 @@ Toma un conjunto diferente de argumentos para crear un instance que los otros ti
Los responses de archivos incluirán los headers apropiados `Content-Length`, `Last-Modified` y `ETag`. Los responses de archivos incluirán los headers apropiados `Content-Length`, `Last-Modified` y `ETag`.
{* ../../docs_src/custom_response/tutorial009.py hl[2,10] *} {* ../../docs_src/custom_response/tutorial009_py39.py hl[2,10] *}
También puedes usar el parámetro `response_class`: También puedes usar el parámetro `response_class`:
{* ../../docs_src/custom_response/tutorial009b.py hl[2,8,10] *} {* ../../docs_src/custom_response/tutorial009b_py39.py hl[2,8,10] *}
En este caso, puedes devolver la path del archivo directamente desde tu *path operation* function. En este caso, puedes devolver la path del archivo directamente desde tu *path operation* function.
@ -273,7 +273,7 @@ Digamos que quieres que devuelva JSON con sangría y formato, por lo que quieres
Podrías crear un `CustomORJSONResponse`. Lo principal que tienes que hacer es crear un método `Response.render(content)` que devuelva el contenido como `bytes`: Podrías crear un `CustomORJSONResponse`. Lo principal que tienes que hacer es crear un método `Response.render(content)` que devuelva el contenido como `bytes`:
{* ../../docs_src/custom_response/tutorial009c.py hl[9:14,17] *} {* ../../docs_src/custom_response/tutorial009c_py39.py hl[9:14,17] *}
Ahora en lugar de devolver: Ahora en lugar de devolver:
@ -299,7 +299,7 @@ El parámetro que define esto es `default_response_class`.
En el ejemplo a continuación, **FastAPI** usará `ORJSONResponse` por defecto, en todas las *path operations*, en lugar de `JSONResponse`. En el ejemplo a continuación, **FastAPI** usará `ORJSONResponse` por defecto, en todas las *path operations*, en lugar de `JSONResponse`.
{* ../../docs_src/custom_response/tutorial010.py hl[2,4] *} {* ../../docs_src/custom_response/tutorial010_py39.py hl[2,4] *}
/// tip | Consejo /// tip | Consejo

12
docs/es/docs/advanced/events.md

@ -30,7 +30,7 @@ Comencemos con un ejemplo y luego veámoslo en detalle.
Creamos una función asíncrona `lifespan()` con `yield` así: Creamos una función asíncrona `lifespan()` con `yield` así:
{* ../../docs_src/events/tutorial003.py hl[16,19] *} {* ../../docs_src/events/tutorial003_py39.py hl[16,19] *}
Aquí estamos simulando la operación costosa de *startup* de cargar el modelo poniendo la función del (falso) modelo en el diccionario con modelos de machine learning antes del `yield`. Este código será ejecutado **antes** de que la aplicación **comience a tomar requests**, durante el *startup*. Aquí estamos simulando la operación costosa de *startup* de cargar el modelo poniendo la función del (falso) modelo en el diccionario con modelos de machine learning antes del `yield`. Este código será ejecutado **antes** de que la aplicación **comience a tomar requests**, durante el *startup*.
@ -48,7 +48,7 @@ Quizás necesites iniciar una nueva versión, o simplemente te cansaste de ejecu
Lo primero que hay que notar es que estamos definiendo una función asíncrona con `yield`. Esto es muy similar a las Dependencias con `yield`. Lo primero que hay que notar es que estamos definiendo una función asíncrona con `yield`. Esto es muy similar a las Dependencias con `yield`.
{* ../../docs_src/events/tutorial003.py hl[14:19] *} {* ../../docs_src/events/tutorial003_py39.py hl[14:19] *}
La primera parte de la función, antes del `yield`, será ejecutada **antes** de que la aplicación comience. La primera parte de la función, antes del `yield`, será ejecutada **antes** de que la aplicación comience.
@ -60,7 +60,7 @@ Si revisas, la función está decorada con un `@asynccontextmanager`.
Eso convierte a la función en algo llamado un "**async context manager**". Eso convierte a la función en algo llamado un "**async context manager**".
{* ../../docs_src/events/tutorial003.py hl[1,13] *} {* ../../docs_src/events/tutorial003_py39.py hl[1,13] *}
Un **context manager** en Python es algo que puedes usar en un statement `with`, por ejemplo, `open()` puede ser usado como un context manager: Un **context manager** en Python es algo que puedes usar en un statement `with`, por ejemplo, `open()` puede ser usado como un context manager:
@ -82,7 +82,7 @@ En nuestro ejemplo de código arriba, no lo usamos directamente, pero se lo pasa
El parámetro `lifespan` de la app de `FastAPI` toma un **async context manager**, por lo que podemos pasar nuestro nuevo `lifespan` async context manager a él. El parámetro `lifespan` de la app de `FastAPI` toma un **async context manager**, por lo que podemos pasar nuestro nuevo `lifespan` async context manager a él.
{* ../../docs_src/events/tutorial003.py hl[22] *} {* ../../docs_src/events/tutorial003_py39.py hl[22] *}
## Eventos Alternativos (obsoleto) { #alternative-events-deprecated } ## Eventos Alternativos (obsoleto) { #alternative-events-deprecated }
@ -104,7 +104,7 @@ Estas funciones pueden ser declaradas con `async def` o `def` normal.
Para añadir una función que debería ejecutarse antes de que la aplicación inicie, declárala con el evento `"startup"`: Para añadir una función que debería ejecutarse antes de que la aplicación inicie, declárala con el evento `"startup"`:
{* ../../docs_src/events/tutorial001.py hl[8] *} {* ../../docs_src/events/tutorial001_py39.py hl[8] *}
En este caso, la función manejadora del evento `startup` inicializará los ítems de la "base de datos" (solo un `dict`) con algunos valores. En este caso, la función manejadora del evento `startup` inicializará los ítems de la "base de datos" (solo un `dict`) con algunos valores.
@ -116,7 +116,7 @@ Y tu aplicación no comenzará a recibir requests hasta que todos los manejadore
Para añadir una función que debería ejecutarse cuando la aplicación se esté cerrando, declárala con el evento `"shutdown"`: Para añadir una función que debería ejecutarse cuando la aplicación se esté cerrando, declárala con el evento `"shutdown"`:
{* ../../docs_src/events/tutorial002.py hl[6] *} {* ../../docs_src/events/tutorial002_py39.py hl[6] *}
Aquí, la función manejadora del evento `shutdown` escribirá una línea de texto `"Application shutdown"` a un archivo `log.txt`. Aquí, la función manejadora del evento `shutdown` escribirá una línea de texto `"Application shutdown"` a un archivo `log.txt`.

2
docs/es/docs/advanced/generate-clients.md

@ -167,7 +167,7 @@ Pero para el cliente generado podríamos **modificar** los operation IDs de Open
Podríamos descargar el JSON de OpenAPI a un archivo `openapi.json` y luego podríamos **remover ese tag prefijado** con un script como este: Podríamos descargar el JSON de OpenAPI a un archivo `openapi.json` y luego podríamos **remover ese tag prefijado** con un script como este:
{* ../../docs_src/generate_clients/tutorial004.py *} {* ../../docs_src/generate_clients/tutorial004_py39.py *}
//// tab | Node.js //// tab | Node.js

6
docs/es/docs/advanced/middleware.md

@ -57,13 +57,13 @@ Impone que todas las requests entrantes deben ser `https` o `wss`.
Cualquier request entrante a `http` o `ws` será redirigida al esquema seguro. Cualquier request entrante a `http` o `ws` será redirigida al esquema seguro.
{* ../../docs_src/advanced_middleware/tutorial001.py hl[2,6] *} {* ../../docs_src/advanced_middleware/tutorial001_py39.py hl[2,6] *}
## `TrustedHostMiddleware` { #trustedhostmiddleware } ## `TrustedHostMiddleware` { #trustedhostmiddleware }
Impone que todas las requests entrantes tengan correctamente configurado el header `Host`, para proteger contra ataques de HTTP Host Header. Impone que todas las requests entrantes tengan correctamente configurado el header `Host`, para proteger contra ataques de HTTP Host Header.
{* ../../docs_src/advanced_middleware/tutorial002.py hl[2,6:8] *} {* ../../docs_src/advanced_middleware/tutorial002_py39.py hl[2,6:8] *}
Se soportan los siguientes argumentos: Se soportan los siguientes argumentos:
@ -78,7 +78,7 @@ Maneja responses GZip para cualquier request que incluya `"gzip"` en el header `
El middleware manejará tanto responses estándar como en streaming. El middleware manejará tanto responses estándar como en streaming.
{* ../../docs_src/advanced_middleware/tutorial003.py hl[2,6] *} {* ../../docs_src/advanced_middleware/tutorial003_py39.py hl[2,6] *}
Se soportan los siguientes argumentos: Se soportan los siguientes argumentos:

2
docs/es/docs/advanced/openapi-webhooks.md

@ -32,7 +32,7 @@ Los webhooks están disponibles en OpenAPI 3.1.0 y superiores, soportados por Fa
Cuando creas una aplicación de **FastAPI**, hay un atributo `webhooks` que puedes usar para definir *webhooks*, de la misma manera que definirías *path operations*, por ejemplo con `@app.webhooks.post()`. Cuando creas una aplicación de **FastAPI**, hay un atributo `webhooks` que puedes usar para definir *webhooks*, de la misma manera que definirías *path operations*, por ejemplo con `@app.webhooks.post()`.
{* ../../docs_src/openapi_webhooks/tutorial001.py hl[9:13,36:53] *} {* ../../docs_src/openapi_webhooks/tutorial001_py39.py hl[9:13,36:53] *}
Los webhooks que defines terminarán en el esquema de **OpenAPI** y en la interfaz automática de **documentación**. Los webhooks que defines terminarán en el esquema de **OpenAPI** y en la interfaz automática de **documentación**.

10
docs/es/docs/advanced/path-operation-advanced-configuration.md

@ -12,7 +12,7 @@ Puedes establecer el `operationId` de OpenAPI para ser usado en tu *path operati
Tienes que asegurarte de que sea único para cada operación. Tienes que asegurarte de que sea único para cada operación.
{* ../../docs_src/path_operation_advanced_configuration/tutorial001.py hl[6] *} {* ../../docs_src/path_operation_advanced_configuration/tutorial001_py39.py hl[6] *}
### Usar el nombre de la *path operation function* como el operationId { #using-the-path-operation-function-name-as-the-operationid } ### Usar el nombre de la *path operation function* como el operationId { #using-the-path-operation-function-name-as-the-operationid }
@ -20,7 +20,7 @@ Si quieres usar los nombres de las funciones de tus APIs como `operationId`s, pu
Deberías hacerlo después de agregar todas tus *path operations*. Deberías hacerlo después de agregar todas tus *path operations*.
{* ../../docs_src/path_operation_advanced_configuration/tutorial002.py hl[2, 12:21, 24] *} {* ../../docs_src/path_operation_advanced_configuration/tutorial002_py39.py hl[2, 12:21, 24] *}
/// tip | Consejo /// tip | Consejo
@ -40,7 +40,7 @@ Incluso si están en diferentes módulos (archivos de Python).
Para excluir una *path operation* del esquema OpenAPI generado (y por lo tanto, de los sistemas de documentación automática), utiliza el parámetro `include_in_schema` y configúralo en `False`: Para excluir una *path operation* del esquema OpenAPI generado (y por lo tanto, de los sistemas de documentación automática), utiliza el parámetro `include_in_schema` y configúralo en `False`:
{* ../../docs_src/path_operation_advanced_configuration/tutorial003.py hl[6] *} {* ../../docs_src/path_operation_advanced_configuration/tutorial003_py39.py hl[6] *}
## Descripción avanzada desde el docstring { #advanced-description-from-docstring } ## Descripción avanzada desde el docstring { #advanced-description-from-docstring }
@ -92,7 +92,7 @@ Puedes extender el esquema de OpenAPI para una *path operation* usando el parám
Este `openapi_extra` puede ser útil, por ejemplo, para declarar [Extensiones de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions): Este `openapi_extra` puede ser útil, por ejemplo, para declarar [Extensiones de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions):
{* ../../docs_src/path_operation_advanced_configuration/tutorial005.py hl[6] *} {* ../../docs_src/path_operation_advanced_configuration/tutorial005_py39.py hl[6] *}
Si abres la documentación automática de la API, tu extensión aparecerá en la parte inferior de la *path operation* específica. Si abres la documentación automática de la API, tu extensión aparecerá en la parte inferior de la *path operation* específica.
@ -139,7 +139,7 @@ Por ejemplo, podrías decidir leer y validar el request con tu propio código, s
Podrías hacer eso con `openapi_extra`: Podrías hacer eso con `openapi_extra`:
{* ../../docs_src/path_operation_advanced_configuration/tutorial006.py hl[19:36, 39:40] *} {* ../../docs_src/path_operation_advanced_configuration/tutorial006_py39.py hl[19:36, 39:40] *}
En este ejemplo, no declaramos ningún modelo Pydantic. De hecho, el cuerpo del request ni siquiera se <abbr title="convertido de algún formato plano, como bytes, a objetos de Python">parse</abbr> como JSON, se lee directamente como `bytes`, y la función `magic_data_reader()` sería la encargada de parsearlo de alguna manera. En este ejemplo, no declaramos ningún modelo Pydantic. De hecho, el cuerpo del request ni siquiera se <abbr title="convertido de algún formato plano, como bytes, a objetos de Python">parse</abbr> como JSON, se lee directamente como `bytes`, y la función `magic_data_reader()` sería la encargada de parsearlo de alguna manera.

2
docs/es/docs/advanced/response-change-status-code.md

@ -20,7 +20,7 @@ Puedes declarar un parámetro de tipo `Response` en tu *path operation function*
Y luego puedes establecer el `status_code` en ese objeto de response *temporal*. Y luego puedes establecer el `status_code` en ese objeto de response *temporal*.
{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *} {* ../../docs_src/response_change_status_code/tutorial001_py39.py hl[1,9,12] *}
Y luego puedes devolver cualquier objeto que necesites, como lo harías normalmente (un `dict`, un modelo de base de datos, etc.). Y luego puedes devolver cualquier objeto que necesites, como lo harías normalmente (un `dict`, un modelo de base de datos, etc.).

4
docs/es/docs/advanced/response-cookies.md

@ -6,7 +6,7 @@ Puedes declarar un parámetro de tipo `Response` en tu *path operation function*
Y luego puedes establecer cookies en ese objeto de response *temporal*. Y luego puedes establecer cookies en ese objeto de response *temporal*.
{* ../../docs_src/response_cookies/tutorial002.py hl[1, 8:9] *} {* ../../docs_src/response_cookies/tutorial002_py39.py hl[1, 8:9] *}
Y entonces puedes devolver cualquier objeto que necesites, como normalmente lo harías (un `dict`, un modelo de base de datos, etc). Y entonces puedes devolver cualquier objeto que necesites, como normalmente lo harías (un `dict`, un modelo de base de datos, etc).
@ -24,7 +24,7 @@ Para hacer eso, puedes crear un response como se describe en [Devolver un Respon
Luego establece Cookies en ella, y luego devuélvela: Luego establece Cookies en ella, y luego devuélvela:
{* ../../docs_src/response_cookies/tutorial001.py hl[10:12] *} {* ../../docs_src/response_cookies/tutorial001_py39.py hl[10:12] *}
/// tip | Consejo /// tip | Consejo

2
docs/es/docs/advanced/response-directly.md

@ -54,7 +54,7 @@ Digamos que quieres devolver un response en <a href="https://en.wikipedia.org/wi
Podrías poner tu contenido XML en un string, poner eso en un `Response`, y devolverlo: Podrías poner tu contenido XML en un string, poner eso en un `Response`, y devolverlo:
{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *} {* ../../docs_src/response_directly/tutorial002_py39.py hl[1,18] *}
## Notas { #notes } ## Notas { #notes }

4
docs/es/docs/advanced/response-headers.md

@ -6,7 +6,7 @@ Puedes declarar un parámetro de tipo `Response` en tu *path operation function*
Y luego puedes establecer headers en ese objeto de response *temporal*. Y luego puedes establecer headers en ese objeto de response *temporal*.
{* ../../docs_src/response_headers/tutorial002.py hl[1, 7:8] *} {* ../../docs_src/response_headers/tutorial002_py39.py hl[1, 7:8] *}
Y luego puedes devolver cualquier objeto que necesites, como harías normalmente (un `dict`, un modelo de base de datos, etc). Y luego puedes devolver cualquier objeto que necesites, como harías normalmente (un `dict`, un modelo de base de datos, etc).
@ -22,7 +22,7 @@ También puedes agregar headers cuando devuelves un `Response` directamente.
Crea un response como se describe en [Retorna un Response Directamente](response-directly.md){.internal-link target=_blank} y pasa los headers como un parámetro adicional: Crea un response como se describe en [Retorna un Response Directamente](response-directly.md){.internal-link target=_blank} y pasa los headers como un parámetro adicional:
{* ../../docs_src/response_headers/tutorial001.py hl[10:12] *} {* ../../docs_src/response_headers/tutorial001_py39.py hl[10:12] *}
/// note | Detalles Técnicos /// note | Detalles Técnicos

10
docs/es/docs/advanced/settings.md

@ -62,7 +62,7 @@ Puedes usar todas las mismas funcionalidades de validación y herramientas que u
//// tab | Pydantic v2 //// tab | Pydantic v2
{* ../../docs_src/settings/tutorial001.py hl[2,5:8,11] *} {* ../../docs_src/settings/tutorial001_py39.py hl[2,5:8,11] *}
//// ////
@ -74,7 +74,7 @@ En Pydantic v1 importarías `BaseSettings` directamente desde `pydantic` en luga
/// ///
{* ../../docs_src/settings/tutorial001_pv1.py hl[2,5:8,11] *} {* ../../docs_src/settings/tutorial001_pv1_py39.py hl[2,5:8,11] *}
//// ////
@ -92,7 +92,7 @@ Luego convertirá y validará los datos. Así que, cuando uses ese objeto `setti
Luego puedes usar el nuevo objeto `settings` en tu aplicación: Luego puedes usar el nuevo objeto `settings` en tu aplicación:
{* ../../docs_src/settings/tutorial001.py hl[18:20] *} {* ../../docs_src/settings/tutorial001_py39.py hl[18:20] *}
### Ejecutar el servidor { #run-the-server } ### Ejecutar el servidor { #run-the-server }
@ -126,11 +126,11 @@ Podrías poner esas configuraciones en otro archivo de módulo como viste en [Ap
Por ejemplo, podrías tener un archivo `config.py` con: Por ejemplo, podrías tener un archivo `config.py` con:
{* ../../docs_src/settings/app01/config.py *} {* ../../docs_src/settings/app01_py39/config.py *}
Y luego usarlo en un archivo `main.py`: Y luego usarlo en un archivo `main.py`:
{* ../../docs_src/settings/app01/main.py hl[3,11:13] *} {* ../../docs_src/settings/app01_py39/main.py hl[3,11:13] *}
/// tip | Consejo /// tip | Consejo

6
docs/es/docs/advanced/sub-applications.md

@ -10,7 +10,7 @@ Si necesitas tener dos aplicaciones de **FastAPI** independientes, cada una con
Primero, crea la aplicación principal de nivel superior de **FastAPI**, y sus *path operations*: Primero, crea la aplicación principal de nivel superior de **FastAPI**, y sus *path operations*:
{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *} {* ../../docs_src/sub_applications/tutorial001_py39.py hl[3, 6:8] *}
### Sub-aplicación { #sub-application } ### Sub-aplicación { #sub-application }
@ -18,7 +18,7 @@ Luego, crea tu sub-aplicación, y sus *path operations*.
Esta sub-aplicación es solo otra aplicación estándar de FastAPI, pero es la que se "montará": Esta sub-aplicación es solo otra aplicación estándar de FastAPI, pero es la que se "montará":
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *} {* ../../docs_src/sub_applications/tutorial001_py39.py hl[11, 14:16] *}
### Montar la sub-aplicación { #mount-the-sub-application } ### Montar la sub-aplicación { #mount-the-sub-application }
@ -26,7 +26,7 @@ En tu aplicación de nivel superior, `app`, monta la sub-aplicación, `subapi`.
En este caso, se montará en el path `/subapi`: En este caso, se montará en el path `/subapi`:
{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *} {* ../../docs_src/sub_applications/tutorial001_py39.py hl[11, 19] *}
### Revisa la documentación automática de la API { #check-the-automatic-api-docs } ### Revisa la documentación automática de la API { #check-the-automatic-api-docs }

2
docs/es/docs/advanced/templates.md

@ -27,7 +27,7 @@ $ pip install jinja2
* Declara un parámetro `Request` en la *path operation* que devolverá una plantilla. * Declara un parámetro `Request` en la *path operation* que devolverá una plantilla.
* Usa los `templates` que creaste para renderizar y devolver un `TemplateResponse`, pasa el nombre de la plantilla, el objeto de request, y un diccionario "context" con pares clave-valor que se usarán dentro de la plantilla Jinja2. * Usa los `templates` que creaste para renderizar y devolver un `TemplateResponse`, pasa el nombre de la plantilla, el objeto de request, y un diccionario "context" con pares clave-valor que se usarán dentro de la plantilla Jinja2.
{* ../../docs_src/templates/tutorial001.py hl[4,11,15:18] *} {* ../../docs_src/templates/tutorial001_py39.py hl[4,11,15:18] *}
/// note | Nota /// note | Nota

4
docs/es/docs/advanced/testing-events.md

@ -2,11 +2,11 @@
Cuando necesitas que `lifespan` se ejecute en tus tests, puedes usar el `TestClient` con un statement `with`: Cuando necesitas que `lifespan` se ejecute en tus tests, puedes usar el `TestClient` con un statement `with`:
{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *} {* ../../docs_src/app_testing/tutorial004_py39.py hl[9:15,18,27:28,30:32,41:43] *}
Puedes leer más detalles sobre ["Ejecutar lifespan en tests en el sitio oficial de documentación de Starlette."](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) Puedes leer más detalles sobre ["Ejecutar lifespan en tests en el sitio oficial de documentación de Starlette."](https://www.starlette.dev/lifespan/#running-lifespan-in-tests)
Para los eventos obsoletos `startup` y `shutdown`, puedes usar el `TestClient` así: Para los eventos obsoletos `startup` y `shutdown`, puedes usar el `TestClient` así:
{* ../../docs_src/app_testing/tutorial003.py hl[9:12,20:24] *} {* ../../docs_src/app_testing/tutorial003_py39.py hl[9:12,20:24] *}

2
docs/es/docs/advanced/testing-websockets.md

@ -4,7 +4,7 @@ Puedes usar el mismo `TestClient` para probar WebSockets.
Para esto, usas el `TestClient` en un statement `with`, conectándote al WebSocket: Para esto, usas el `TestClient` en un statement `with`, conectándote al WebSocket:
{* ../../docs_src/app_testing/tutorial002.py hl[27:31] *} {* ../../docs_src/app_testing/tutorial002_py39.py hl[27:31] *}
/// note | Nota /// note | Nota

2
docs/es/docs/advanced/using-request-directly.md

@ -29,7 +29,7 @@ Imaginemos que quieres obtener la dirección IP/host del cliente dentro de tu *p
Para eso necesitas acceder al request directamente. Para eso necesitas acceder al request directamente.
{* ../../docs_src/using_request_directly/tutorial001.py hl[1,7:8] *} {* ../../docs_src/using_request_directly/tutorial001_py39.py hl[1,7:8] *}
Al declarar un parámetro de *path operation function* con el tipo siendo `Request`, **FastAPI** sabrá pasar el `Request` en ese parámetro. Al declarar un parámetro de *path operation function* con el tipo siendo `Request`, **FastAPI** sabrá pasar el `Request` en ese parámetro.

6
docs/es/docs/advanced/websockets.md

@ -38,13 +38,13 @@ En producción tendrías una de las opciones anteriores.
Pero es la forma más sencilla de enfocarse en el lado del servidor de WebSockets y tener un ejemplo funcional: Pero es la forma más sencilla de enfocarse en el lado del servidor de WebSockets y tener un ejemplo funcional:
{* ../../docs_src/websockets/tutorial001.py hl[2,6:38,41:43] *} {* ../../docs_src/websockets/tutorial001_py39.py hl[2,6:38,41:43] *}
## Crear un `websocket` { #create-a-websocket } ## Crear un `websocket` { #create-a-websocket }
En tu aplicación de **FastAPI**, crea un `websocket`: En tu aplicación de **FastAPI**, crea un `websocket`:
{* ../../docs_src/websockets/tutorial001.py hl[1,46:47] *} {* ../../docs_src/websockets/tutorial001_py39.py hl[1,46:47] *}
/// note | Detalles Técnicos /// note | Detalles Técnicos
@ -58,7 +58,7 @@ También podrías usar `from starlette.websockets import WebSocket`.
En tu ruta de WebSocket puedes `await` para recibir mensajes y enviar mensajes. En tu ruta de WebSocket puedes `await` para recibir mensajes y enviar mensajes.
{* ../../docs_src/websockets/tutorial001.py hl[48:52] *} {* ../../docs_src/websockets/tutorial001_py39.py hl[48:52] *}
Puedes recibir y enviar datos binarios, de texto y JSON. Puedes recibir y enviar datos binarios, de texto y JSON.

2
docs/es/docs/advanced/wsgi.md

@ -12,7 +12,7 @@ Luego envuelve la aplicación WSGI (p. ej., Flask) con el middleware.
Y luego móntala bajo un path. Y luego móntala bajo un path.
{* ../../docs_src/wsgi/tutorial001.py hl[2:3,3] *} {* ../../docs_src/wsgi/tutorial001_py39.py hl[2:3,3] *}
## Revisa { #check-it } ## Revisa { #check-it }

2
docs/es/docs/how-to/conditional-openapi.md

@ -29,7 +29,7 @@ Puedes usar fácilmente las mismas configuraciones de Pydantic para configurar t
Por ejemplo: Por ejemplo:
{* ../../docs_src/conditional_openapi/tutorial001.py hl[6,11] *} {* ../../docs_src/conditional_openapi/tutorial001_py39.py hl[6,11] *}
Aquí declaramos la configuración `openapi_url` con el mismo valor por defecto de `"/openapi.json"`. Aquí declaramos la configuración `openapi_url` con el mismo valor por defecto de `"/openapi.json"`.

6
docs/es/docs/how-to/configure-swagger-ui.md

@ -18,7 +18,7 @@ Sin cambiar la configuración, el resaltado de sintaxis está activado por defec
Pero puedes desactivarlo estableciendo `syntaxHighlight` en `False`: Pero puedes desactivarlo estableciendo `syntaxHighlight` en `False`:
{* ../../docs_src/configure_swagger_ui/tutorial001.py hl[3] *} {* ../../docs_src/configure_swagger_ui/tutorial001_py39.py hl[3] *}
...y entonces Swagger UI ya no mostrará el resaltado de sintaxis: ...y entonces Swagger UI ya no mostrará el resaltado de sintaxis:
@ -28,7 +28,7 @@ Pero puedes desactivarlo estableciendo `syntaxHighlight` en `False`:
De la misma manera, podrías configurar el tema del resaltado de sintaxis con la clave `"syntaxHighlight.theme"` (ten en cuenta que tiene un punto en el medio): De la misma manera, podrías configurar el tema del resaltado de sintaxis con la clave `"syntaxHighlight.theme"` (ten en cuenta que tiene un punto en el medio):
{* ../../docs_src/configure_swagger_ui/tutorial002.py hl[3] *} {* ../../docs_src/configure_swagger_ui/tutorial002_py39.py hl[3] *}
Esa configuración cambiaría el tema de color del resaltado de sintaxis: Esa configuración cambiaría el tema de color del resaltado de sintaxis:
@ -46,7 +46,7 @@ Puedes sobrescribir cualquiera de ellos estableciendo un valor diferente en el a
Por ejemplo, para desactivar `deepLinking` podrías pasar estas configuraciones a `swagger_ui_parameters`: Por ejemplo, para desactivar `deepLinking` podrías pasar estas configuraciones a `swagger_ui_parameters`:
{* ../../docs_src/configure_swagger_ui/tutorial003.py hl[3] *} {* ../../docs_src/configure_swagger_ui/tutorial003_py39.py hl[3] *}
## Otros parámetros de Swagger UI { #other-swagger-ui-parameters } ## Otros parámetros de Swagger UI { #other-swagger-ui-parameters }

14
docs/es/docs/how-to/custom-docs-ui-assets.md

@ -18,7 +18,7 @@ El primer paso es desactivar la documentación automática, ya que por defecto,
Para desactivarlos, establece sus URLs en `None` cuando crees tu aplicación de `FastAPI`: Para desactivarlos, establece sus URLs en `None` cuando crees tu aplicación de `FastAPI`:
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[8] *} {* ../../docs_src/custom_docs_ui/tutorial001_py39.py hl[8] *}
### Incluye la documentación personalizada { #include-the-custom-docs } ### Incluye la documentación personalizada { #include-the-custom-docs }
@ -34,7 +34,7 @@ Puedes reutilizar las funciones internas de FastAPI para crear las páginas HTML
Y de manera similar para ReDoc... Y de manera similar para ReDoc...
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[2:6,11:19,22:24,27:33] *} {* ../../docs_src/custom_docs_ui/tutorial001_py39.py hl[2:6,11:19,22:24,27:33] *}
/// tip | Consejo /// tip | Consejo
@ -50,7 +50,7 @@ Swagger UI lo manejará detrás de escena para ti, pero necesita este auxiliar d
Ahora, para poder probar que todo funciona, crea una *path operation*: Ahora, para poder probar que todo funciona, crea una *path operation*:
{* ../../docs_src/custom_docs_ui/tutorial001.py hl[36:38] *} {* ../../docs_src/custom_docs_ui/tutorial001_py39.py hl[36:38] *}
### Pruébalo { #test-it } ### Pruébalo { #test-it }
@ -118,7 +118,7 @@ Después de eso, tu estructura de archivos podría verse así:
* Importa `StaticFiles`. * Importa `StaticFiles`.
* "Monta" una instance de `StaticFiles()` en un path específico. * "Monta" una instance de `StaticFiles()` en un path específico.
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[7,11] *} {* ../../docs_src/custom_docs_ui/tutorial002_py39.py hl[7,11] *}
### Prueba los archivos estáticos { #test-the-static-files } ### Prueba los archivos estáticos { #test-the-static-files }
@ -144,7 +144,7 @@ Igual que cuando usas un CDN personalizado, el primer paso es desactivar la docu
Para desactivarlos, establece sus URLs en `None` cuando crees tu aplicación de `FastAPI`: Para desactivarlos, establece sus URLs en `None` cuando crees tu aplicación de `FastAPI`:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[9] *} {* ../../docs_src/custom_docs_ui/tutorial002_py39.py hl[9] *}
### Incluye la documentación personalizada para archivos estáticos { #include-the-custom-docs-for-static-files } ### Incluye la documentación personalizada para archivos estáticos { #include-the-custom-docs-for-static-files }
@ -160,7 +160,7 @@ Nuevamente, puedes reutilizar las funciones internas de FastAPI para crear las p
Y de manera similar para ReDoc... Y de manera similar para ReDoc...
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[2:6,14:22,25:27,30:36] *} {* ../../docs_src/custom_docs_ui/tutorial002_py39.py hl[2:6,14:22,25:27,30:36] *}
/// tip | Consejo /// tip | Consejo
@ -176,7 +176,7 @@ Swagger UI lo manejará detrás de escena para ti, pero necesita este auxiliar d
Ahora, para poder probar que todo funciona, crea una *path operation*: Ahora, para poder probar que todo funciona, crea una *path operation*:
{* ../../docs_src/custom_docs_ui/tutorial002.py hl[39:41] *} {* ../../docs_src/custom_docs_ui/tutorial002_py39.py hl[39:41] *}
### Prueba la UI de Archivos Estáticos { #test-static-files-ui } ### Prueba la UI de Archivos Estáticos { #test-static-files-ui }

10
docs/es/docs/how-to/extending-openapi.md

@ -43,19 +43,19 @@ Por ejemplo, vamos a añadir <a href="https://github.com/Rebilly/ReDoc/blob/mast
Primero, escribe toda tu aplicación **FastAPI** como normalmente: Primero, escribe toda tu aplicación **FastAPI** como normalmente:
{* ../../docs_src/extending_openapi/tutorial001.py hl[1,4,7:9] *} {* ../../docs_src/extending_openapi/tutorial001_py39.py hl[1,4,7:9] *}
### Generar el esquema de OpenAPI { #generate-the-openapi-schema } ### Generar el esquema de OpenAPI { #generate-the-openapi-schema }
Luego, usa la misma función de utilidad para generar el esquema de OpenAPI, dentro de una función `custom_openapi()`: Luego, usa la misma función de utilidad para generar el esquema de OpenAPI, dentro de una función `custom_openapi()`:
{* ../../docs_src/extending_openapi/tutorial001.py hl[2,15:21] *} {* ../../docs_src/extending_openapi/tutorial001_py39.py hl[2,15:21] *}
### Modificar el esquema de OpenAPI { #modify-the-openapi-schema } ### Modificar el esquema de OpenAPI { #modify-the-openapi-schema }
Ahora puedes añadir la extensión de ReDoc, agregando un `x-logo` personalizado al "objeto" `info` en el esquema de OpenAPI: Ahora puedes añadir la extensión de ReDoc, agregando un `x-logo` personalizado al "objeto" `info` en el esquema de OpenAPI:
{* ../../docs_src/extending_openapi/tutorial001.py hl[22:24] *} {* ../../docs_src/extending_openapi/tutorial001_py39.py hl[22:24] *}
### Cachear el esquema de OpenAPI { #cache-the-openapi-schema } ### Cachear el esquema de OpenAPI { #cache-the-openapi-schema }
@ -65,13 +65,13 @@ De esa forma, tu aplicación no tendrá que generar el esquema cada vez que un u
Se generará solo una vez, y luego se usará el mismo esquema cacheado para las siguientes requests. Se generará solo una vez, y luego se usará el mismo esquema cacheado para las siguientes requests.
{* ../../docs_src/extending_openapi/tutorial001.py hl[13:14,25:26] *} {* ../../docs_src/extending_openapi/tutorial001_py39.py hl[13:14,25:26] *}
### Sobrescribir el método { #override-the-method } ### Sobrescribir el método { #override-the-method }
Ahora puedes reemplazar el método `.openapi()` por tu nueva función. Ahora puedes reemplazar el método `.openapi()` por tu nueva función.
{* ../../docs_src/extending_openapi/tutorial001.py hl[29] *} {* ../../docs_src/extending_openapi/tutorial001_py39.py hl[29] *}
### Revisa { #check-it } ### Revisa { #check-it }

2
docs/es/docs/how-to/graphql.md

@ -35,7 +35,7 @@ Dependiendo de tu caso de uso, podrías preferir usar un paquete diferente, pero
Aquí tienes una pequeña vista previa de cómo podrías integrar Strawberry con FastAPI: Aquí tienes una pequeña vista previa de cómo podrías integrar Strawberry con FastAPI:
{* ../../docs_src/graphql/tutorial001.py hl[3,22,25] *} {* ../../docs_src/graphql/tutorial001_py39.py hl[3,22,25] *}
Puedes aprender más sobre Strawberry en la <a href="https://strawberry.rocks/" class="external-link" target="_blank">documentación de Strawberry</a>. Puedes aprender más sobre Strawberry en la <a href="https://strawberry.rocks/" class="external-link" target="_blank">documentación de Strawberry</a>.

164
docs/es/docs/python-types.md

@ -22,7 +22,7 @@ Si eres un experto en Python, y ya sabes todo sobre las anotaciones de tipos, sa
Comencemos con un ejemplo simple: Comencemos con un ejemplo simple:
{* ../../docs_src/python_types/tutorial001.py *} {* ../../docs_src/python_types/tutorial001_py39.py *}
Llamar a este programa genera: Llamar a este programa genera:
@ -36,7 +36,7 @@ La función hace lo siguiente:
* Convierte la primera letra de cada uno a mayúsculas con `title()`. * Convierte la primera letra de cada uno a mayúsculas con `title()`.
* <abbr title="Los une, como uno. Con el contenido de uno después del otro.">Concatena</abbr> ambos con un espacio en el medio. * <abbr title="Los une, como uno. Con el contenido de uno después del otro.">Concatena</abbr> ambos con un espacio en el medio.
{* ../../docs_src/python_types/tutorial001.py hl[2] *} {* ../../docs_src/python_types/tutorial001_py39.py hl[2] *}
### Edítalo { #edit-it } ### Edítalo { #edit-it }
@ -78,7 +78,7 @@ Eso es todo.
Esas son las "anotaciones de tipos": Esas son las "anotaciones de tipos":
{* ../../docs_src/python_types/tutorial002.py hl[1] *} {* ../../docs_src/python_types/tutorial002_py39.py hl[1] *}
Eso no es lo mismo que declarar valores predeterminados como sería con: Eso no es lo mismo que declarar valores predeterminados como sería con:
@ -106,7 +106,7 @@ Con eso, puedes desplazarte, viendo las opciones, hasta que encuentres la que "t
Revisa esta función, ya tiene anotaciones de tipos: Revisa esta función, ya tiene anotaciones de tipos:
{* ../../docs_src/python_types/tutorial003.py hl[1] *} {* ../../docs_src/python_types/tutorial003_py39.py hl[1] *}
Porque el editor conoce los tipos de las variables, no solo obtienes autocompletado, también obtienes chequeo de errores: Porque el editor conoce los tipos de las variables, no solo obtienes autocompletado, también obtienes chequeo de errores:
@ -114,7 +114,7 @@ Porque el editor conoce los tipos de las variables, no solo obtienes autocomplet
Ahora sabes que debes corregirlo, convertir `age` a un string con `str(age)`: Ahora sabes que debes corregirlo, convertir `age` a un string con `str(age)`:
{* ../../docs_src/python_types/tutorial004.py hl[2] *} {* ../../docs_src/python_types/tutorial004_py39.py hl[2] *}
## Declaración de tipos { #declaring-types } ## Declaración de tipos { #declaring-types }
@ -133,7 +133,7 @@ Puedes usar, por ejemplo:
* `bool` * `bool`
* `bytes` * `bytes`
{* ../../docs_src/python_types/tutorial005.py hl[1] *} {* ../../docs_src/python_types/tutorial005_py39.py hl[1] *}
### Tipos genéricos con parámetros de tipo { #generic-types-with-type-parameters } ### Tipos genéricos con parámetros de tipo { #generic-types-with-type-parameters }
@ -161,56 +161,24 @@ Si puedes usar las **últimas versiones de Python**, utiliza los ejemplos para l
Por ejemplo, vamos a definir una variable para ser una `list` de `str`. Por ejemplo, vamos a definir una variable para ser una `list` de `str`.
//// tab | Python 3.9+
Declara la variable, con la misma sintaxis de dos puntos (`:`). Declara la variable, con la misma sintaxis de dos puntos (`:`).
Como tipo, pon `list`. Como tipo, pon `list`.
Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes: Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes:
```Python hl_lines="1" {* ../../docs_src/python_types/tutorial006_py39.py hl[1] *}
{!> ../../docs_src/python_types/tutorial006_py39.py!}
```
////
//// tab | Python 3.8+
De `typing`, importa `List` (con una `L` mayúscula):
```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial006.py!}
```
Declara la variable, con la misma sintaxis de dos puntos (`:`).
Como tipo, pon el `List` que importaste de `typing`.
Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes:
```Python hl_lines="4"
{!> ../../docs_src/python_types/tutorial006.py!}
```
////
/// info | Información /// info | Información
Esos tipos internos en los corchetes se denominan "parámetros de tipo". Esos tipos internos en los corchetes se denominan "parámetros de tipo".
En este caso, `str` es el parámetro de tipo pasado a `List` (o `list` en Python 3.9 y superior). En este caso, `str` es el parámetro de tipo pasado a `list`.
/// ///
Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta lista es un `str`". Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta lista es un `str`".
/// tip | Consejo
Si usas Python 3.9 o superior, no tienes que importar `List` de `typing`, puedes usar el mismo tipo `list` regular en su lugar.
///
Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la lista: Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la lista:
<img src="/img/python-types/image05.png"> <img src="/img/python-types/image05.png">
@ -225,21 +193,7 @@ Y aún así, el editor sabe que es un `str` y proporciona soporte para eso.
Harías lo mismo para declarar `tuple`s y `set`s: Harías lo mismo para declarar `tuple`s y `set`s:
//// tab | Python 3.9+ {* ../../docs_src/python_types/tutorial007_py39.py hl[1] *}
```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial007_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial007.py!}
```
////
Esto significa: Esto significa:
@ -254,21 +208,7 @@ El primer parámetro de tipo es para las claves del `dict`.
El segundo parámetro de tipo es para los valores del `dict`: El segundo parámetro de tipo es para los valores del `dict`:
//// tab | Python 3.9+ {* ../../docs_src/python_types/tutorial008_py39.py hl[1] *}
```Python hl_lines="1"
{!> ../../docs_src/python_types/tutorial008_py39.py!}
```
////
//// tab | Python 3.8+
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial008.py!}
```
////
Esto significa: Esto significa:
@ -292,10 +232,10 @@ En Python 3.10 también hay una **nueva sintaxis** donde puedes poner los posibl
//// ////
//// tab | Python 3.8+ //// tab | Python 3.9+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial008b.py!} {!> ../../docs_src/python_types/tutorial008b_py39.py!}
``` ```
//// ////
@ -309,7 +249,7 @@ Puedes declarar que un valor podría tener un tipo, como `str`, pero que tambié
En Python 3.6 y posteriores (incluyendo Python 3.10) puedes declararlo importando y usando `Optional` del módulo `typing`. En Python 3.6 y posteriores (incluyendo Python 3.10) puedes declararlo importando y usando `Optional` del módulo `typing`.
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!../../docs_src/python_types/tutorial009.py!} {!../../docs_src/python_types/tutorial009_py39.py!}
``` ```
Usar `Optional[str]` en lugar de solo `str` te permitirá al editor ayudarte a detectar errores donde podrías estar asumiendo que un valor siempre es un `str`, cuando en realidad también podría ser `None`. Usar `Optional[str]` en lugar de solo `str` te permitirá al editor ayudarte a detectar errores donde podrías estar asumiendo que un valor siempre es un `str`, cuando en realidad también podría ser `None`.
@ -326,18 +266,18 @@ Esto también significa que en Python 3.10, puedes usar `Something | None`:
//// ////
//// tab | Python 3.8+ //// tab | Python 3.9+
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial009.py!} {!> ../../docs_src/python_types/tutorial009_py39.py!}
``` ```
//// ////
//// tab | Python 3.8+ alternativa //// tab | Python 3.9+ alternativa
```Python hl_lines="1 4" ```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial009b.py!} {!> ../../docs_src/python_types/tutorial009b_py39.py!}
``` ```
//// ////
@ -357,7 +297,7 @@ Se trata solo de las palabras y nombres. Pero esas palabras pueden afectar cómo
Como ejemplo, tomemos esta función: Como ejemplo, tomemos esta función:
{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *} {* ../../docs_src/python_types/tutorial009c_py39.py hl[1,4] *}
El parámetro `name` está definido como `Optional[str]`, pero **no es opcional**, no puedes llamar a la función sin el parámetro: El parámetro `name` está definido como `Optional[str]`, pero **no es opcional**, no puedes llamar a la función sin el parámetro:
@ -390,10 +330,10 @@ Puedes usar los mismos tipos integrados como genéricos (con corchetes y tipos d
* `set` * `set`
* `dict` * `dict`
Y lo mismo que con Python 3.8, desde el módulo `typing`: Y, como con versiones anteriores de Python, desde el módulo `typing`:
* `Union` * `Union`
* `Optional` (lo mismo que con Python 3.8) * `Optional`
* ...y otros. * ...y otros.
En Python 3.10, como alternativa a usar los genéricos `Union` y `Optional`, puedes usar la <abbr title='también llamado "operador OR a nivel de bits", pero ese significado no es relevante aquí'>barra vertical (`|`)</abbr> para declarar uniones de tipos, eso es mucho mejor y más simple. En Python 3.10, como alternativa a usar los genéricos `Union` y `Optional`, puedes usar la <abbr title='también llamado "operador OR a nivel de bits", pero ese significado no es relevante aquí'>barra vertical (`|`)</abbr> para declarar uniones de tipos, eso es mucho mejor y más simple.
@ -409,7 +349,7 @@ Puedes usar los mismos tipos integrados como genéricos (con corchetes y tipos d
* `set` * `set`
* `dict` * `dict`
Y lo mismo que con Python 3.8, desde el módulo `typing`: Y generics desde el módulo `typing`:
* `Union` * `Union`
* `Optional` * `Optional`
@ -417,29 +357,17 @@ Y lo mismo que con Python 3.8, desde el módulo `typing`:
//// ////
//// tab | Python 3.8+
* `List`
* `Tuple`
* `Set`
* `Dict`
* `Union`
* `Optional`
* ...y otros.
////
### Clases como tipos { #classes-as-types } ### Clases como tipos { #classes-as-types }
También puedes declarar una clase como el tipo de una variable. También puedes declarar una clase como el tipo de una variable.
Digamos que tienes una clase `Person`, con un nombre: Digamos que tienes una clase `Person`, con un nombre:
{* ../../docs_src/python_types/tutorial010.py hl[1:3] *} {* ../../docs_src/python_types/tutorial010_py39.py hl[1:3] *}
Luego puedes declarar una variable para que sea de tipo `Person`: Luego puedes declarar una variable para que sea de tipo `Person`:
{* ../../docs_src/python_types/tutorial010.py hl[6] *} {* ../../docs_src/python_types/tutorial010_py39.py hl[6] *}
Y luego, nuevamente, obtienes todo el soporte del editor: Y luego, nuevamente, obtienes todo el soporte del editor:
@ -463,29 +391,7 @@ Y obtienes todo el soporte del editor con ese objeto resultante.
Un ejemplo de la documentación oficial de Pydantic: Un ejemplo de la documentación oficial de Pydantic:
//// tab | Python 3.10+ {* ../../docs_src/python_types/tutorial011_py310.py *}
```Python
{!> ../../docs_src/python_types/tutorial011_py310.py!}
```
////
//// tab | Python 3.9+
```Python
{!> ../../docs_src/python_types/tutorial011_py39.py!}
```
////
//// tab | Python 3.8+
```Python
{!> ../../docs_src/python_types/tutorial011.py!}
```
////
/// info | Información /// info | Información
@ -507,27 +413,9 @@ Pydantic tiene un comportamiento especial cuando utilizas `Optional` o `Union[So
Python también tiene una funcionalidad que permite poner **<abbr title="Datos sobre los datos, en este caso, información sobre el tipo, por ejemplo, una descripción.">metadatos</abbr> adicional** en estas anotaciones de tipos usando `Annotated`. Python también tiene una funcionalidad que permite poner **<abbr title="Datos sobre los datos, en este caso, información sobre el tipo, por ejemplo, una descripción.">metadatos</abbr> adicional** en estas anotaciones de tipos usando `Annotated`.
//// tab | Python 3.9+ Desde Python 3.9, `Annotated` es parte de la standard library, así que puedes importarlo desde `typing`.
En Python 3.9, `Annotated` es parte de la standard library, así que puedes importarlo desde `typing`.
```Python hl_lines="1 4" {* ../../docs_src/python_types/tutorial013_py39.py hl[1,4] *}
{!> ../../docs_src/python_types/tutorial013_py39.py!}
```
////
//// tab | Python 3.8+
En versiones por debajo de Python 3.9, importas `Annotated` de `typing_extensions`.
Ya estará instalado con **FastAPI**.
```Python hl_lines="1 4"
{!> ../../docs_src/python_types/tutorial013.py!}
```
////
Python en sí no hace nada con este `Annotated`. Y para los editores y otras herramientas, el tipo sigue siendo `str`. Python en sí no hace nada con este `Annotated`. Y para los editores y otras herramientas, el tipo sigue siendo `str`.

6
docs/es/docs/tutorial/background-tasks.md

@ -15,7 +15,7 @@ Esto incluye, por ejemplo:
Primero, importa `BackgroundTasks` y define un parámetro en tu *path operation function* con una declaración de tipo de `BackgroundTasks`: Primero, importa `BackgroundTasks` y define un parámetro en tu *path operation function* con una declaración de tipo de `BackgroundTasks`:
{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *} {* ../../docs_src/background_tasks/tutorial001_py39.py hl[1,13] *}
**FastAPI** creará el objeto de tipo `BackgroundTasks` por ti y lo pasará como ese parámetro. **FastAPI** creará el objeto de tipo `BackgroundTasks` por ti y lo pasará como ese parámetro.
@ -31,13 +31,13 @@ En este caso, la función de tarea escribirá en un archivo (simulando el envío
Y como la operación de escritura no usa `async` y `await`, definimos la función con un `def` normal: Y como la operación de escritura no usa `async` y `await`, definimos la función con un `def` normal:
{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *} {* ../../docs_src/background_tasks/tutorial001_py39.py hl[6:9] *}
## Agregar la tarea en segundo plano { #add-the-background-task } ## Agregar la tarea en segundo plano { #add-the-background-task }
Dentro de tu *path operation function*, pasa tu función de tarea al objeto de *background tasks* con el método `.add_task()`: Dentro de tu *path operation function*, pasa tu función de tarea al objeto de *background tasks* con el método `.add_task()`:
{* ../../docs_src/background_tasks/tutorial001.py hl[14] *} {* ../../docs_src/background_tasks/tutorial001_py39.py hl[14] *}
`.add_task()` recibe como argumentos: `.add_task()` recibe como argumentos:

30
docs/es/docs/tutorial/body-nested-models.md

@ -14,35 +14,15 @@ Esto hará que `tags` sea una lista, aunque no declare el tipo de los elementos
Pero Python tiene una forma específica de declarar listas con tipos internos, o "parámetros de tipo": Pero Python tiene una forma específica de declarar listas con tipos internos, o "parámetros de tipo":
### Importar `List` de typing { #import-typings-list }
En Python 3.9 y superior, puedes usar el `list` estándar para declarar estas anotaciones de tipo como veremos a continuación. 💡
Pero en versiones de Python anteriores a 3.9 (desde 3.6 en adelante), primero necesitas importar `List` del módulo `typing` estándar de Python:
{* ../../docs_src/body_nested_models/tutorial002.py hl[1] *}
### Declarar una `list` con un parámetro de tipo { #declare-a-list-with-a-type-parameter } ### Declarar una `list` con un parámetro de tipo { #declare-a-list-with-a-type-parameter }
Para declarar tipos que tienen parámetros de tipo (tipos internos), como `list`, `dict`, `tuple`: Para declarar tipos que tienen parámetros de tipo (tipos internos), como `list`, `dict`, `tuple`,
pasa el/los tipo(s) interno(s) como "parámetros de tipo" usando corchetes: `[` y `]`
* Si estás en una versión de Python inferior a 3.9, importa su versión equivalente del módulo `typing`
* Pasa el/los tipo(s) interno(s) como "parámetros de tipo" usando corchetes: `[` y `]`
En Python 3.9 sería:
```Python ```Python
my_list: list[str] my_list: list[str]
``` ```
En versiones de Python anteriores a 3.9, sería:
```Python
from typing import List
my_list: List[str]
```
Eso es toda la sintaxis estándar de Python para declaraciones de tipo. Eso es toda la sintaxis estándar de Python para declaraciones de tipo.
Usa esa misma sintaxis estándar para atributos de modelos con tipos internos. Usa esa misma sintaxis estándar para atributos de modelos con tipos internos.
@ -178,12 +158,6 @@ Observa cómo `Offer` tiene una lista de `Item`s, que a su vez tienen una lista
Si el valor superior del cuerpo JSON que esperas es un `array` JSON (una `list` en Python), puedes declarar el tipo en el parámetro de la función, al igual que en los modelos Pydantic: Si el valor superior del cuerpo JSON que esperas es un `array` JSON (una `list` en Python), puedes declarar el tipo en el parámetro de la función, al igual que en los modelos Pydantic:
```Python
images: List[Image]
```
o en Python 3.9 y superior:
```Python ```Python
images: list[Image] images: list[Image]
``` ```

2
docs/es/docs/tutorial/cors.md

@ -46,7 +46,7 @@ También puedes especificar si tu backend permite:
* Métodos HTTP específicos (`POST`, `PUT`) o todos ellos con el comodín `"*"`. * Métodos HTTP específicos (`POST`, `PUT`) o todos ellos con el comodín `"*"`.
* Headers HTTP específicos o todos ellos con el comodín `"*"`. * Headers HTTP específicos o todos ellos con el comodín `"*"`.
{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *} {* ../../docs_src/cors/tutorial001_py39.py hl[2,6:11,13:19] *}
Los parámetros predeterminados utilizados por la implementación de `CORSMiddleware` son restrictivos por defecto, por lo que necesitarás habilitar explícitamente orígenes, métodos o headers particulares para que los navegadores estén permitidos de usarlos en un contexto de Cross-Domain. Los parámetros predeterminados utilizados por la implementación de `CORSMiddleware` son restrictivos por defecto, por lo que necesitarás habilitar explícitamente orígenes, métodos o headers particulares para que los navegadores estén permitidos de usarlos en un contexto de Cross-Domain.

2
docs/es/docs/tutorial/debugging.md

@ -6,7 +6,7 @@ Puedes conectar el depurador en tu editor, por ejemplo con Visual Studio Code o
En tu aplicación de FastAPI, importa y ejecuta `uvicorn` directamente: En tu aplicación de FastAPI, importa y ejecuta `uvicorn` directamente:
{* ../../docs_src/debugging/tutorial001.py hl[1,15] *} {* ../../docs_src/debugging/tutorial001_py39.py hl[1,15] *}
### Acerca de `__name__ == "__main__"` { #about-name-main } ### Acerca de `__name__ == "__main__"` { #about-name-main }

10
docs/es/docs/tutorial/dependencies/dependencies-with-yield.md

@ -29,15 +29,15 @@ Por ejemplo, podrías usar esto para crear una sesión de base de datos y cerrar
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 la declaración `yield` se ejecuta antes de crear un response:
{* ../../docs_src/dependencies/tutorial007.py hl[2:4] *} {* ../../docs_src/dependencies/tutorial007_py39.py hl[2:4] *}
El valor generado es lo que se inyecta en *path operations* y otras dependencias: El valor generado es lo que se inyecta en *path operations* y otras dependencias:
{* ../../docs_src/dependencies/tutorial007.py hl[4] *} {* ../../docs_src/dependencies/tutorial007_py39.py hl[4] *}
El código posterior a la declaración `yield` se ejecuta después del response: El código posterior a la declaración `yield` se ejecuta después del response:
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *} {* ../../docs_src/dependencies/tutorial007_py39.py hl[5:6] *}
/// tip | Consejo /// tip | Consejo
@ -57,7 +57,7 @@ Por lo tanto, puedes buscar esa excepción específica dentro de la dependencia
Del mismo modo, puedes usar `finally` para asegurarte de que los pasos de salida se ejecuten, sin importar si hubo una excepción o no. Del mismo modo, puedes usar `finally` para asegurarte de que los pasos de salida se ejecuten, sin importar si hubo una excepción o no.
{* ../../docs_src/dependencies/tutorial007.py hl[3,5] *} {* ../../docs_src/dependencies/tutorial007_py39.py hl[3,5] *}
## Sub-dependencias con `yield` { #sub-dependencies-with-yield } ## Sub-dependencias con `yield` { #sub-dependencies-with-yield }
@ -270,7 +270,7 @@ En Python, puedes crear Context Managers <a href="https://docs.python.org/3/refe
También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` usando También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` usando
`with` o `async with` en la función de dependencia: `with` o `async with` en la función de dependencia:
{* ../../docs_src/dependencies/tutorial010.py hl[1:9,13] *} {* ../../docs_src/dependencies/tutorial010_py39.py hl[1:9,13] *}
/// tip | Consejo /// tip | Consejo

2
docs/es/docs/tutorial/dependencies/global-dependencies.md

@ -6,7 +6,7 @@ Similar a como puedes [agregar `dependencies` a los *path operation decorators*]
En ese caso, se aplicarán a todas las *path operations* en la aplicación: En ese caso, se aplicarán a todas las *path operations* en la aplicación:
{* ../../docs_src/dependencies/tutorial012_an_py39.py hl[16] *} {* ../../docs_src/dependencies/tutorial012_an_py39.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){.internal-link target=_blank} siguen aplicándose, pero en este caso, a todas las *path operations* en la app.

14
docs/es/docs/tutorial/first-steps.md

@ -2,7 +2,7 @@
El archivo FastAPI más simple podría verse así: El archivo FastAPI más simple podría verse así:
{* ../../docs_src/first_steps/tutorial001.py *} {* ../../docs_src/first_steps/tutorial001_py39.py *}
Copia eso en un archivo `main.py`. Copia eso en un archivo `main.py`.
@ -183,7 +183,7 @@ Deploying to FastAPI Cloud...
### Paso 1: importa `FastAPI` { #step-1-import-fastapi } ### Paso 1: importa `FastAPI` { #step-1-import-fastapi }
{* ../../docs_src/first_steps/tutorial001.py hl[1] *} {* ../../docs_src/first_steps/tutorial001_py39.py hl[1] *}
`FastAPI` es una clase de Python que proporciona toda la funcionalidad para tu API. `FastAPI` es una clase de Python que proporciona toda la funcionalidad para tu API.
@ -197,7 +197,7 @@ Puedes usar toda la funcionalidad de <a href="https://www.starlette.dev/" class=
### Paso 2: crea una "instance" de `FastAPI` { #step-2-create-a-fastapi-instance } ### Paso 2: crea una "instance" de `FastAPI` { #step-2-create-a-fastapi-instance }
{* ../../docs_src/first_steps/tutorial001.py hl[3] *} {* ../../docs_src/first_steps/tutorial001_py39.py hl[3] *}
Aquí la variable `app` será una "instance" de la clase `FastAPI`. Aquí la variable `app` será una "instance" de la clase `FastAPI`.
@ -266,7 +266,7 @@ Vamos a llamarlas "**operaciones**" también.
#### Define un *path operation decorator* { #define-a-path-operation-decorator } #### Define un *path operation decorator* { #define-a-path-operation-decorator }
{* ../../docs_src/first_steps/tutorial001.py hl[6] *} {* ../../docs_src/first_steps/tutorial001_py39.py hl[6] *}
El `@app.get("/")` le dice a **FastAPI** que la función justo debajo se encarga de manejar requests que vayan a: El `@app.get("/")` le dice a **FastAPI** que la función justo debajo se encarga de manejar requests que vayan a:
@ -320,7 +320,7 @@ Esta es nuestra "**path operation function**":
* **operation**: es `get`. * **operation**: es `get`.
* **function**: es la función debajo del "decorador" (debajo de `@app.get("/")`). * **function**: es la función debajo del "decorador" (debajo de `@app.get("/")`).
{* ../../docs_src/first_steps/tutorial001.py hl[7] *} {* ../../docs_src/first_steps/tutorial001_py39.py hl[7] *}
Esta es una función de Python. Esta es una función de Python.
@ -332,7 +332,7 @@ En este caso, es una función `async`.
También podrías definirla como una función normal en lugar de `async def`: También podrías definirla como una función normal en lugar de `async def`:
{* ../../docs_src/first_steps/tutorial003.py hl[7] *} {* ../../docs_src/first_steps/tutorial003_py39.py hl[7] *}
/// note | Nota /// note | Nota
@ -342,7 +342,7 @@ Si no sabes la diferencia, Revisa la sección [Async: *"¿Tienes prisa?"*](../as
### Paso 5: retorna el contenido { #step-5-return-the-content } ### Paso 5: retorna el contenido { #step-5-return-the-content }
{* ../../docs_src/first_steps/tutorial001.py hl[8] *} {* ../../docs_src/first_steps/tutorial001_py39.py hl[8] *}
Puedes retornar un `dict`, `list`, valores singulares como `str`, `int`, etc. Puedes retornar un `dict`, `list`, valores singulares como `str`, `int`, etc.

16
docs/es/docs/tutorial/handling-errors.md

@ -25,7 +25,7 @@ Para devolver responses HTTP con errores al cliente, usa `HTTPException`.
### Importa `HTTPException` { #import-httpexception } ### Importa `HTTPException` { #import-httpexception }
{* ../../docs_src/handling_errors/tutorial001.py hl[1] *} {* ../../docs_src/handling_errors/tutorial001_py39.py hl[1] *}
### Lanza un `HTTPException` en tu código { #raise-an-httpexception-in-your-code } ### Lanza un `HTTPException` en tu código { #raise-an-httpexception-in-your-code }
@ -39,7 +39,7 @@ El beneficio de lanzar una excepción en lugar de `return`ar un valor será más
En este ejemplo, cuando el cliente solicita un ítem por un ID que no existe, lanza una excepción con un código de estado de `404`: En este ejemplo, cuando el cliente solicita un ítem por un ID que no existe, lanza una excepción con un código de estado de `404`:
{* ../../docs_src/handling_errors/tutorial001.py hl[11] *} {* ../../docs_src/handling_errors/tutorial001_py39.py hl[11] *}
### El response resultante { #the-resulting-response } ### El response resultante { #the-resulting-response }
@ -77,7 +77,7 @@ Probablemente no necesitarás usarlos directamente en tu código.
Pero en caso de que los necesites para un escenario avanzado, puedes agregar headers personalizados: Pero en caso de que los necesites para un escenario avanzado, puedes agregar headers personalizados:
{* ../../docs_src/handling_errors/tutorial002.py hl[14] *} {* ../../docs_src/handling_errors/tutorial002_py39.py hl[14] *}
## Instalar manejadores de excepciones personalizados { #install-custom-exception-handlers } ## Instalar manejadores de excepciones personalizados { #install-custom-exception-handlers }
@ -89,7 +89,7 @@ Y quieres manejar esta excepción globalmente con FastAPI.
Podrías agregar un manejador de excepciones personalizado con `@app.exception_handler()`: Podrías agregar un manejador de excepciones personalizado con `@app.exception_handler()`:
{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *} {* ../../docs_src/handling_errors/tutorial003_py39.py hl[5:7,13:18,24] *}
Aquí, si solicitas `/unicorns/yolo`, la *path operation* lanzará un `UnicornException`. Aquí, si solicitas `/unicorns/yolo`, la *path operation* lanzará un `UnicornException`.
@ -127,7 +127,7 @@ Para sobrescribirlo, importa el `RequestValidationError` y úsalo con `@app.exce
El manejador de excepciones recibirá un `Request` y la excepción. El manejador de excepciones recibirá un `Request` y la excepción.
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:19] *} {* ../../docs_src/handling_errors/tutorial004_py39.py hl[2,14:19] *}
Ahora, si vas a `/items/foo`, en lugar de obtener el error JSON por defecto con: Ahora, si vas a `/items/foo`, en lugar de obtener el error JSON por defecto con:
@ -159,7 +159,7 @@ De la misma manera, puedes sobrescribir el manejador de `HTTPException`.
Por ejemplo, podrías querer devolver un response de texto plano en lugar de JSON para estos errores: Por ejemplo, podrías querer devolver un response de texto plano en lugar de JSON para estos errores:
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,25] *} {* ../../docs_src/handling_errors/tutorial004_py39.py hl[3:4,9:11,25] *}
/// note | Nota Técnica /// note | Nota Técnica
@ -183,7 +183,7 @@ El `RequestValidationError` contiene el `body` que recibió con datos inválidos
Podrías usarlo mientras desarrollas tu aplicación para registrar el body y depurarlo, devolverlo al usuario, etc. Podrías usarlo mientras desarrollas tu aplicación para registrar el body y depurarlo, devolverlo al usuario, etc.
{* ../../docs_src/handling_errors/tutorial005.py hl[14] *} {* ../../docs_src/handling_errors/tutorial005_py39.py hl[14] *}
Ahora intenta enviar un ítem inválido como: Ahora intenta enviar un ítem inválido como:
@ -239,6 +239,6 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
Si quieres usar la excepción junto con los mismos manejadores de excepciones predeterminados de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones predeterminados de `fastapi.exception_handlers`: Si quieres usar la excepción junto con los mismos manejadores de excepciones predeterminados de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones predeterminados de `fastapi.exception_handlers`:
{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *} {* ../../docs_src/handling_errors/tutorial006_py39.py hl[2:5,15,21] *}
En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones predeterminados. En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones predeterminados.

12
docs/es/docs/tutorial/metadata.md

@ -18,7 +18,7 @@ Puedes establecer los siguientes campos que se usan en la especificación OpenAP
Puedes configurarlos de la siguiente manera: Puedes configurarlos de la siguiente manera:
{* ../../docs_src/metadata/tutorial001.py hl[3:16, 19:32] *} {* ../../docs_src/metadata/tutorial001_py39.py hl[3:16, 19:32] *}
/// tip | Consejo /// tip | Consejo
@ -36,7 +36,7 @@ Desde OpenAPI 3.1.0 y FastAPI 0.99.0, también puedes establecer la `license_inf
Por ejemplo: Por ejemplo:
{* ../../docs_src/metadata/tutorial001_1.py hl[31] *} {* ../../docs_src/metadata/tutorial001_1_py39.py hl[31] *}
## Metadata para etiquetas { #metadata-for-tags } ## Metadata para etiquetas { #metadata-for-tags }
@ -58,7 +58,7 @@ Probemos eso en un ejemplo con etiquetas para `users` y `items`.
Crea metadata para tus etiquetas y pásala al parámetro `openapi_tags`: Crea metadata para tus etiquetas y pásala al parámetro `openapi_tags`:
{* ../../docs_src/metadata/tutorial004.py hl[3:16,18] *} {* ../../docs_src/metadata/tutorial004_py39.py hl[3:16,18] *}
Nota que puedes utilizar Markdown dentro de las descripciones, por ejemplo "login" se mostrará en negrita (**login**) y "fancy" se mostrará en cursiva (_fancy_). Nota que puedes utilizar Markdown dentro de las descripciones, por ejemplo "login" se mostrará en negrita (**login**) y "fancy" se mostrará en cursiva (_fancy_).
@ -72,7 +72,7 @@ No tienes que agregar metadata para todas las etiquetas que uses.
Usa el parámetro `tags` con tus *path operations* (y `APIRouter`s) para asignarlas a diferentes etiquetas: Usa el parámetro `tags` con tus *path operations* (y `APIRouter`s) para asignarlas a diferentes etiquetas:
{* ../../docs_src/metadata/tutorial004.py hl[21,26] *} {* ../../docs_src/metadata/tutorial004_py39.py hl[21,26] *}
/// info | Información /// info | Información
@ -100,7 +100,7 @@ Pero puedes configurarlo con el parámetro `openapi_url`.
Por ejemplo, para configurarlo para que se sirva en `/api/v1/openapi.json`: Por ejemplo, para configurarlo para que se sirva en `/api/v1/openapi.json`:
{* ../../docs_src/metadata/tutorial002.py hl[3] *} {* ../../docs_src/metadata/tutorial002_py39.py hl[3] *}
Si quieres deshabilitar el esquema OpenAPI completamente, puedes establecer `openapi_url=None`, eso también deshabilitará las interfaces de usuario de documentación que lo usan. Si quieres deshabilitar el esquema OpenAPI completamente, puedes establecer `openapi_url=None`, eso también deshabilitará las interfaces de usuario de documentación que lo usan.
@ -117,4 +117,4 @@ Puedes configurar las dos interfaces de usuario de documentación incluidas:
Por ejemplo, para configurar Swagger UI para que se sirva en `/documentation` y deshabilitar ReDoc: Por ejemplo, para configurar Swagger UI para que se sirva en `/documentation` y deshabilitar ReDoc:
{* ../../docs_src/metadata/tutorial003.py hl[3] *} {* ../../docs_src/metadata/tutorial003_py39.py hl[3] *}

4
docs/es/docs/tutorial/middleware.md

@ -31,7 +31,7 @@ La función middleware recibe:
* Luego devuelve la `response` generada por la correspondiente *path operation*. * Luego devuelve la `response` generada por la correspondiente *path operation*.
* Puedes entonces modificar aún más la `response` antes de devolverla. * Puedes entonces modificar aún más la `response` antes de devolverla.
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *} {* ../../docs_src/middleware/tutorial001_py39.py hl[8:9,11,14] *}
/// tip | Consejo /// tip | Consejo
@ -57,7 +57,7 @@ Y también después de que se genere la `response`, antes de devolverla.
Por ejemplo, podrías añadir un custom header `X-Process-Time` que contenga el tiempo en segundos que tomó procesar la request y generar una response: Por ejemplo, podrías añadir un custom header `X-Process-Time` que contenga el tiempo en segundos que tomó procesar la request y generar una response:
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *} {* ../../docs_src/middleware/tutorial001_py39.py hl[10,12:13] *}
/// tip | Consejo /// tip | Consejo

4
docs/es/docs/tutorial/path-operation-configuration.md

@ -46,7 +46,7 @@ En estos casos, podría tener sentido almacenar las tags en un `Enum`.
**FastAPI** soporta eso de la misma manera que con strings normales: **FastAPI** soporta eso de la misma manera que con strings normales:
{* ../../docs_src/path_operation_configuration/tutorial002b.py hl[1,8:10,13,18] *} {* ../../docs_src/path_operation_configuration/tutorial002b_py39.py hl[1,8:10,13,18] *}
## Resumen y Descripción { #summary-and-description } ## Resumen y Descripción { #summary-and-description }
@ -92,7 +92,7 @@ Entonces, si no proporcionas una, **FastAPI** generará automáticamente una de
Si necesitas marcar una *path operation* como <abbr title="obsoleta, se recomienda no usarla">deprecated</abbr>, pero sin eliminarla, pasa el parámetro `deprecated`: Si necesitas marcar una *path operation* como <abbr title="obsoleta, se recomienda no usarla">deprecated</abbr>, pero sin eliminarla, pasa el parámetro `deprecated`:
{* ../../docs_src/path_operation_configuration/tutorial006.py hl[16] *} {* ../../docs_src/path_operation_configuration/tutorial006_py39.py hl[16] *}
Se marcará claramente como deprecado en la documentación interactiva: Se marcará claramente como deprecado en la documentación interactiva:

4
docs/es/docs/tutorial/path-params-numeric-validations.md

@ -54,7 +54,7 @@ No importa para **FastAPI**. Detectará los parámetros por sus nombres, tipos y
Así que puedes declarar tu función como: Así que puedes declarar tu función como:
{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *} {* ../../docs_src/path_params_numeric_validations/tutorial002_py39.py hl[7] *}
Pero ten en cuenta que si usas `Annotated`, no tendrás este problema, no importará ya que no estás usando los valores por defecto de los parámetros de la función para `Query()` o `Path()`. Pero ten en cuenta que si usas `Annotated`, no tendrás este problema, no importará ya que no estás usando los valores por defecto de los parámetros de la función para `Query()` o `Path()`.
@ -83,7 +83,7 @@ Pasa `*`, como el primer parámetro de la función.
Python no hará nada con ese `*`, pero sabrá que todos los parámetros siguientes deben ser llamados como argumentos de palabras clave (parejas key-value), también conocidos como <abbr title="De: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Incluso si no tienen un valor por defecto. Python no hará nada con ese `*`, pero sabrá que todos los parámetros siguientes deben ser llamados como argumentos de palabras clave (parejas key-value), también conocidos como <abbr title="De: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Incluso si no tienen un valor por defecto.
{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *} {* ../../docs_src/path_params_numeric_validations/tutorial003_py39.py hl[7] *}
### Mejor con `Annotated` { #better-with-annotated } ### Mejor con `Annotated` { #better-with-annotated }

26
docs/es/docs/tutorial/path-params.md

@ -2,7 +2,7 @@
Puedes declarar "parámetros" o "variables" de path con la misma sintaxis que se usa en los format strings de Python: Puedes declarar "parámetros" o "variables" de path con la misma sintaxis que se usa en los format strings de Python:
{* ../../docs_src/path_params/tutorial001.py hl[6:7] *} {* ../../docs_src/path_params/tutorial001_py39.py hl[6:7] *}
El valor del parámetro de path `item_id` se pasará a tu función como el argumento `item_id`. El valor del parámetro de path `item_id` se pasará a tu función como el argumento `item_id`.
@ -16,7 +16,7 @@ Así que, si ejecutas este ejemplo y vas a <a href="http://127.0.0.1:8000/items/
Puedes declarar el tipo de un parámetro de path en la función, usando anotaciones de tipos estándar de Python: Puedes declarar el tipo de un parámetro de path en la función, usando anotaciones de tipos estándar de Python:
{* ../../docs_src/path_params/tutorial002.py hl[7] *} {* ../../docs_src/path_params/tutorial002_py39.py hl[7] *}
En este caso, `item_id` se declara como un `int`. En este caso, `item_id` se declara como un `int`.
@ -118,13 +118,13 @@ Y luego también puedes tener un path `/users/{user_id}` para obtener datos sobr
Debido a que las *path operations* se evalúan en orden, necesitas asegurarte de que el path para `/users/me` se declara antes que el de `/users/{user_id}`: Debido a que las *path operations* se evalúan en orden, necesitas asegurarte de que el path para `/users/me` se declara antes que el de `/users/{user_id}`:
{* ../../docs_src/path_params/tutorial003.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003_py39.py hl[6,11] *}
De lo contrario, el path para `/users/{user_id}` también coincidiría para `/users/me`, "pensando" que está recibiendo un parámetro `user_id` con un valor de `"me"`. De lo contrario, el path para `/users/{user_id}` también coincidiría para `/users/me`, "pensando" que está recibiendo un parámetro `user_id` con un valor de `"me"`.
De manera similar, no puedes redefinir una path operation: De manera similar, no puedes redefinir una path operation:
{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *} {* ../../docs_src/path_params/tutorial003b_py39.py hl[6,11] *}
La primera siempre será utilizada ya que el path coincide primero. La primera siempre será utilizada ya que el path coincide primero.
@ -140,13 +140,7 @@ Al heredar de `str`, la documentación de la API podrá saber que los valores de
Luego crea atributos de clase con valores fijos, que serán los valores válidos disponibles: Luego crea atributos de clase con valores fijos, que serán los valores válidos disponibles:
{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *} {* ../../docs_src/path_params/tutorial005_py39.py hl[1,6:9] *}
/// info | Información
<a href="https://docs.python.org/3/library/enum.html" class="external-link" target="_blank">Las enumeraciones (o enums) están disponibles en Python</a> desde la versión 3.4.
///
/// tip | Consejo /// tip | Consejo
@ -158,7 +152,7 @@ Si te estás preguntando, "AlexNet", "ResNet" y "LeNet" son solo nombres de <abb
Luego crea un *path parameter* con una anotación de tipo usando la clase enum que creaste (`ModelName`): Luego crea un *path parameter* con una anotación de tipo usando la clase enum que creaste (`ModelName`):
{* ../../docs_src/path_params/tutorial005.py hl[16] *} {* ../../docs_src/path_params/tutorial005_py39.py hl[16] *}
### Revisa la documentación { #check-the-docs } ### Revisa la documentación { #check-the-docs }
@ -174,13 +168,13 @@ El valor del *path parameter* será un *miembro* de enumeración.
Puedes compararlo con el *miembro* de enumeración en tu enum creada `ModelName`: Puedes compararlo con el *miembro* de enumeración en tu enum creada `ModelName`:
{* ../../docs_src/path_params/tutorial005.py hl[17] *} {* ../../docs_src/path_params/tutorial005_py39.py hl[17] *}
#### Obtener el valor de *enumeración* { #get-the-enumeration-value } #### Obtener el valor de *enumeración* { #get-the-enumeration-value }
Puedes obtener el valor actual (un `str` en este caso) usando `model_name.value`, o en general, `your_enum_member.value`: Puedes obtener el valor actual (un `str` en este caso) usando `model_name.value`, o en general, `your_enum_member.value`:
{* ../../docs_src/path_params/tutorial005.py hl[20] *} {* ../../docs_src/path_params/tutorial005_py39.py hl[20] *}
/// tip | Consejo /// tip | Consejo
@ -194,7 +188,7 @@ Puedes devolver *miembros de enum* desde tu *path operation*, incluso anidados e
Serán convertidos a sus valores correspondientes (cadenas en este caso) antes de devolverlos al cliente: Serán convertidos a sus valores correspondientes (cadenas en este caso) antes de devolverlos al cliente:
{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *} {* ../../docs_src/path_params/tutorial005_py39.py hl[18,21,23] *}
En tu cliente recibirás un response JSON como: En tu cliente recibirás un response JSON como:
@ -233,7 +227,7 @@ En este caso, el nombre del parámetro es `file_path`, y la última parte, `:pat
Así que, puedes usarlo con: Así que, puedes usarlo con:
{* ../../docs_src/path_params/tutorial004.py hl[6] *} {* ../../docs_src/path_params/tutorial004_py39.py hl[6] *}
/// tip | Consejo /// tip | Consejo

4
docs/es/docs/tutorial/query-params.md

@ -2,7 +2,7 @@
Cuando declaras otros parámetros de función que no son parte de los parámetros de path, son automáticamente interpretados como parámetros de "query". Cuando declaras otros parámetros de función que no son parte de los parámetros de path, son automáticamente interpretados como parámetros de "query".
{* ../../docs_src/query_params/tutorial001.py hl[9] *} {* ../../docs_src/query_params/tutorial001_py39.py hl[9] *}
La query es el conjunto de pares clave-valor que van después del `?` en una URL, separados por caracteres `&`. La query es el conjunto de pares clave-valor que van después del `?` en una URL, separados por caracteres `&`.
@ -127,7 +127,7 @@ Si no quieres agregar un valor específico pero solo hacer que sea opcional, est
Pero cuando quieres hacer un parámetro de query requerido, simplemente no declares ningún valor por defecto: Pero cuando quieres hacer un parámetro de query requerido, simplemente no declares ningún valor por defecto:
{* ../../docs_src/query_params/tutorial005.py hl[6:7] *} {* ../../docs_src/query_params/tutorial005_py39.py hl[6:7] *}
Aquí el parámetro de query `needy` es un parámetro de query requerido de tipo `str`. Aquí el parámetro de query `needy` es un parámetro de query requerido de tipo `str`.

4
docs/es/docs/tutorial/response-model.md

@ -183,7 +183,7 @@ Podría haber casos en los que devuelvas algo que no es un campo válido de Pyda
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){.internal-link target=_blank}.
{* ../../docs_src/response_model/tutorial003_02.py hl[8,10:11] *} {* ../../docs_src/response_model/tutorial003_02_py39.py hl[8,10:11] *}
Este caso simple es manejado automáticamente por FastAPI porque la anotación del tipo de retorno es la clase (o una subclase de) `Response`. Este caso simple es manejado automáticamente por FastAPI porque la anotación del tipo de retorno es la clase (o una subclase de) `Response`.
@ -193,7 +193,7 @@ Y las herramientas también estarán felices porque tanto `RedirectResponse` com
También puedes usar una subclase de `Response` en la anotación del tipo: También puedes usar una subclase de `Response` en la anotación del tipo:
{* ../../docs_src/response_model/tutorial003_03.py hl[8:9] *} {* ../../docs_src/response_model/tutorial003_03_py39.py hl[8:9] *}
Esto también funcionará porque `RedirectResponse` es una subclase de `Response`, y FastAPI manejará automáticamente este caso simple. Esto también funcionará porque `RedirectResponse` es una subclase de `Response`, y FastAPI manejará automáticamente este caso simple.

6
docs/es/docs/tutorial/response-status-code.md

@ -8,7 +8,7 @@ De la misma manera que puedes especificar un modelo de response, también puedes
* `@app.delete()` * `@app.delete()`
* etc. * etc.
{* ../../docs_src/response_status_code/tutorial001.py hl[6] *} {* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
/// note | Nota /// note | Nota
@ -74,7 +74,7 @@ Para saber más sobre cada código de estado y qué código es para qué, revisa
Veamos de nuevo el ejemplo anterior: Veamos de nuevo el ejemplo anterior:
{* ../../docs_src/response_status_code/tutorial001.py hl[6] *} {* ../../docs_src/response_status_code/tutorial001_py39.py hl[6] *}
`201` es el código de estado para "Created". `201` es el código de estado para "Created".
@ -82,7 +82,7 @@ Pero no tienes que memorizar lo que significa cada uno de estos códigos.
Puedes usar las variables de conveniencia de `fastapi.status`. Puedes usar las variables de conveniencia de `fastapi.status`.
{* ../../docs_src/response_status_code/tutorial002.py hl[1,6] *} {* ../../docs_src/response_status_code/tutorial002_py39.py hl[1,6] *}
Son solo una conveniencia, mantienen el mismo número, pero de esa manera puedes usar el autocompletado del editor para encontrarlos: Son solo una conveniencia, mantienen el mismo número, pero de esa manera puedes usar el autocompletado del editor para encontrarlos:

2
docs/es/docs/tutorial/static-files.md

@ -7,7 +7,7 @@ Puedes servir archivos estáticos automáticamente desde un directorio utilizand
* Importa `StaticFiles`. * Importa `StaticFiles`.
* "Monta" una instance de `StaticFiles()` en un path específico. * "Monta" una instance de `StaticFiles()` en un path específico.
{* ../../docs_src/static_files/tutorial001.py hl[2,6] *} {* ../../docs_src/static_files/tutorial001_py39.py hl[2,6] *}
/// note | Detalles Técnicos /// note | Detalles Técnicos

6
docs/es/docs/tutorial/testing.md

@ -30,7 +30,7 @@ Usa el objeto `TestClient` de la misma manera que con `httpx`.
Escribe declaraciones `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`). Escribe declaraciones `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`).
{* ../../docs_src/app_testing/tutorial001.py hl[2,12,15:18] *} {* ../../docs_src/app_testing/tutorial001_py39.py hl[2,12,15:18] *}
/// tip | Consejo /// tip | Consejo
@ -75,7 +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**: En el archivo `main.py` tienes tu aplicación de **FastAPI**:
{* ../../docs_src/app_testing/main.py *} {* ../../docs_src/app_testing/app_a_py39/main.py *}
### Archivo de prueba { #testing-file } ### Archivo de prueba { #testing-file }
@ -91,7 +91,7 @@ Entonces podrías tener un archivo `test_main.py` con tus pruebas. Podría estar
Debido a que este archivo está en el mismo paquete, puedes usar importaciones relativas para importar el objeto `app` desde el módulo `main` (`main.py`): Debido a que este archivo está en el mismo paquete, puedes usar importaciones relativas para importar el objeto `app` desde el módulo `main` (`main.py`):
{* ../../docs_src/app_testing/test_main.py hl[3] *} {* ../../docs_src/app_testing/app_a_py39/test_main.py hl[3] *}
...y tener el código para las pruebas tal como antes. ...y tener el código para las pruebas tal como antes.

Loading…
Cancel
Save