mirror of https://github.com/tiangolo/fastapi.git
🌐 Update translations for es (add-missing)
This commit is contained in:
parent
04519af098
commit
481c46c4cf
|
|
@ -0,0 +1,503 @@
|
|||
# Archivo de prueba de LLM { #llm-test-file }
|
||||
|
||||
Este documento prueba si el <abbr title="Large Language Model – Modelo de lenguaje grande">LLM</abbr>, que traduce la documentación, entiende el `general_prompt` en `scripts/translate.py` y el prompt específico del idioma en `docs/{language code}/llm-prompt.md`. El prompt específico del idioma se agrega al final de `general_prompt`.
|
||||
|
||||
Las pruebas añadidas aquí serán vistas por todas las personas que diseñan prompts específicos del idioma.
|
||||
|
||||
Úsalo de la siguiente manera:
|
||||
|
||||
* Ten un prompt específico del idioma – `docs/{language code}/llm-prompt.md`.
|
||||
* Haz una traducción fresca de este documento a tu idioma destino (mira, por ejemplo, el comando `translate-page` de `translate.py`). Esto creará la traducción en `docs/{language code}/docs/_llm-test.md`.
|
||||
* Comprueba si todo está bien en la traducción.
|
||||
* Si es necesario, mejora tu prompt específico del idioma, el prompt general, o el documento en inglés.
|
||||
* Luego corrige manualmente los problemas restantes en la traducción para que sea una buena traducción.
|
||||
* Vuelve a traducir, teniendo la buena traducción en su lugar. El resultado ideal sería que el LLM ya no hiciera cambios a la traducción. Eso significa que el prompt general y tu prompt específico del idioma están tan bien como pueden estar (a veces hará algunos cambios aparentemente aleatorios; la razón es que <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">los LLMs no son algoritmos deterministas</a>).
|
||||
|
||||
Las pruebas:
|
||||
|
||||
## Fragmentos de código { #code-snippets }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
Este es un fragmento de código: `foo`. Y este es otro fragmento de código: `bar`. Y otro más: `baz quux`.
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
El contenido de los fragmentos de código debe dejarse tal cual.
|
||||
|
||||
Consulta la sección `### Content of code snippets` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
////
|
||||
|
||||
## Comillas { #quotes }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
Ayer, mi amigo escribió: "Si escribes 'incorrectly' correctamente, lo habrás escrito incorrectamente". A lo que respondí: "Correcto, pero 'incorrectly' está incorrecto, no '"incorrectly"'".
|
||||
|
||||
/// note | Nota
|
||||
|
||||
El LLM probablemente traducirá esto mal. Lo interesante es si mantiene la traducción corregida al volver a traducir.
|
||||
|
||||
///
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
La persona que diseña el prompt puede elegir si quiere convertir comillas neutras a comillas tipográficas. También está bien dejarlas como están.
|
||||
|
||||
Consulta por ejemplo la sección `### Quotes` en `docs/de/llm-prompt.md`.
|
||||
|
||||
////
|
||||
|
||||
## Comillas en fragmentos de código { #quotes-in-code-snippets }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
`pip install "foo[bar]"`
|
||||
|
||||
Ejemplos de literales de string en fragmentos de código: `"this"`, `'that'`.
|
||||
|
||||
Un ejemplo difícil de literales de string en fragmentos de código: `f"I like {'oranges' if orange else "apples"}"`
|
||||
|
||||
Hardcore: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"`
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
... Sin embargo, las comillas dentro de fragmentos de código deben quedarse tal cual.
|
||||
|
||||
////
|
||||
|
||||
## bloques de código { #code-blocks }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
Un ejemplo de código Bash...
|
||||
|
||||
```bash
|
||||
# Imprime un saludo al universo
|
||||
echo "Hello universe"
|
||||
```
|
||||
|
||||
...y un ejemplo de código de consola...
|
||||
|
||||
```console
|
||||
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
|
||||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server
|
||||
Searching for package file structure
|
||||
```
|
||||
|
||||
...y otro ejemplo de código de consola...
|
||||
|
||||
```console
|
||||
// Crea un directorio "Code"
|
||||
$ mkdir code
|
||||
// Cambia a ese directorio
|
||||
$ cd code
|
||||
```
|
||||
|
||||
...y un ejemplo de código Python...
|
||||
|
||||
```Python
|
||||
wont_work() # Esto no va a funcionar 😱
|
||||
works(foo="bar") # Esto funciona 🎉
|
||||
```
|
||||
|
||||
...y eso es todo.
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
El código en bloques de código no debe modificarse, con la excepción de los comentarios.
|
||||
|
||||
Consulta la sección `### Content of code blocks` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
////
|
||||
|
||||
## Pestañas y cajas coloreadas { #tabs-and-colored-boxes }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
/// info | Información
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// note | Nota
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// note | Detalles técnicos
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// check | Revisa
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// tip | Consejo
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// warning | Advertencia
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
/// danger | Peligro
|
||||
Algo de texto
|
||||
///
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
Las pestañas y los bloques `Info`/`Note`/`Warning`/etc. deben tener la traducción de su título añadida después de una barra vertical (`|`).
|
||||
|
||||
Consulta las secciones `### Special blocks` y `### Tab blocks` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
////
|
||||
|
||||
## Enlaces web e internos { #web-and-internal-links }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
El texto del enlace debe traducirse, la dirección del enlace debe permanecer sin cambios:
|
||||
|
||||
* [Enlace al encabezado de arriba](#code-snippets)
|
||||
* [Enlace interno](index.md#installation){.internal-link target=_blank}
|
||||
* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">Enlace externo</a>
|
||||
* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">Enlace a un estilo</a>
|
||||
* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">Enlace a un script</a>
|
||||
* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">Enlace a una imagen</a>
|
||||
|
||||
El texto del enlace debe traducirse, la dirección del enlace debe apuntar a la traducción:
|
||||
|
||||
* <a href="https://fastapi.tiangolo.com/es/" class="external-link" target="_blank">Enlace a FastAPI</a>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
Los enlaces deben traducirse, pero su dirección debe permanecer sin cambios. Una excepción son los enlaces absolutos a páginas de la documentación de FastAPI. En ese caso deben enlazar a la traducción.
|
||||
|
||||
Consulta la sección `### Links` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
////
|
||||
|
||||
## Elementos HTML "abbr" { #html-abbr-elements }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
Aquí algunas cosas envueltas en elementos HTML "abbr" (algunas son inventadas):
|
||||
|
||||
### El abbr da una frase completa { #the-abbr-gives-a-full-phrase }
|
||||
|
||||
* <abbr title="Getting Things Done – Hacer las cosas">GTD</abbr>
|
||||
* <abbr title="less than – menor que"><code>lt</code></abbr>
|
||||
* <abbr title="XML Web Token – Token web XML">XWT</abbr>
|
||||
* <abbr title="Parallel Server Gateway Interface – Interfaz de pasarela de servidor paralela">PSGI</abbr>
|
||||
|
||||
### El abbr da una explicación { #the-abbr-gives-an-explanation }
|
||||
|
||||
* <abbr title="Un grupo de máquinas configuradas para estar conectadas y trabajar juntas de alguna manera.">clúster</abbr>
|
||||
* <abbr title="Un método de machine learning que usa redes neuronales artificiales con numerosas capas ocultas entre las capas de entrada y salida, desarrollando así una estructura interna completa">Deep Learning</abbr>
|
||||
|
||||
### El abbr da una frase completa y una explicación { #the-abbr-gives-a-full-phrase-and-an-explanation }
|
||||
|
||||
* <abbr title="Mozilla Developer Network – Red de Desarrolladores de Mozilla: documentación para desarrolladores, escrita por la gente de Firefox">MDN</abbr>
|
||||
* <abbr title="Input/Output – Entrada/Salida: lectura o escritura de disco, comunicaciones de red.">I/O</abbr>.
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
Los atributos "title" de los elementos "abbr" se traducen siguiendo instrucciones específicas.
|
||||
|
||||
Las traducciones pueden añadir sus propios elementos "abbr" que el LLM no debe eliminar. P. ej., para explicar palabras en inglés.
|
||||
|
||||
Consulta la sección `### HTML abbr elements` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
////
|
||||
|
||||
## Encabezados { #headings }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
### Desarrolla una webapp - un tutorial { #develop-a-webapp-a-tutorial }
|
||||
|
||||
Hola.
|
||||
|
||||
### Anotaciones de tipos y -anotaciones { #type-hints-and-annotations }
|
||||
|
||||
Hola de nuevo.
|
||||
|
||||
### Superclases y subclases { #super-and-subclasses }
|
||||
|
||||
Hola de nuevo.
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
La única regla estricta para los encabezados es que el LLM deje la parte del hash dentro de llaves sin cambios, lo que asegura que los enlaces no se rompan.
|
||||
|
||||
Consulta la sección `### Headings` en el prompt general en `scripts/translate.py`.
|
||||
|
||||
Para instrucciones específicas del idioma, mira p. ej. la sección `### Headings` en `docs/de/llm-prompt.md`.
|
||||
|
||||
////
|
||||
|
||||
## Términos usados en la documentación { #terms-used-in-the-docs }
|
||||
|
||||
//// tab | Prueba
|
||||
|
||||
* tú
|
||||
* tu
|
||||
|
||||
* p. ej.
|
||||
* etc.
|
||||
|
||||
* `foo` como un `int`
|
||||
* `bar` como un `str`
|
||||
* `baz` como una `list`
|
||||
|
||||
* el Tutorial - Guía de usuario
|
||||
* la Guía de usuario avanzada
|
||||
* la documentación de SQLModel
|
||||
* la documentación de la API
|
||||
* la documentación automática
|
||||
|
||||
* Ciencia de datos
|
||||
* Deep Learning
|
||||
* Machine Learning
|
||||
* Inyección de dependencias
|
||||
* autenticación HTTP Basic
|
||||
* HTTP Digest
|
||||
* formato ISO
|
||||
* el estándar JSON Schema
|
||||
* el JSON Schema
|
||||
* la definición del esquema
|
||||
* Flujo de contraseña
|
||||
* Móvil
|
||||
|
||||
* obsoleto
|
||||
* diseñado
|
||||
* inválido
|
||||
* sobre la marcha
|
||||
* estándar
|
||||
* por defecto
|
||||
* sensible a mayúsculas/minúsculas
|
||||
* insensible a mayúsculas/minúsculas
|
||||
|
||||
* servir la aplicación
|
||||
* servir la página
|
||||
|
||||
* la app
|
||||
* la aplicación
|
||||
|
||||
* la request
|
||||
* la response
|
||||
* la response de error
|
||||
|
||||
* la path operation
|
||||
* el decorador de path operation
|
||||
* la path operation function
|
||||
|
||||
* el body
|
||||
* el request body
|
||||
* el response body
|
||||
* el body JSON
|
||||
* el body del formulario
|
||||
* el body de archivo
|
||||
* el cuerpo de la función
|
||||
|
||||
* el parámetro
|
||||
* el parámetro del body
|
||||
* el parámetro del path
|
||||
* el parámetro de query
|
||||
* el parámetro de cookie
|
||||
* el parámetro de header
|
||||
* el parámetro del formulario
|
||||
* el parámetro de la función
|
||||
|
||||
* el evento
|
||||
* el evento de inicio
|
||||
* el inicio del servidor
|
||||
* el evento de apagado
|
||||
* el evento de lifespan
|
||||
|
||||
* el manejador
|
||||
* el manejador de eventos
|
||||
* el manejador de excepciones
|
||||
* manejar
|
||||
|
||||
* el modelo
|
||||
* el modelo de Pydantic
|
||||
* el modelo de datos
|
||||
* el modelo de base de datos
|
||||
* el modelo de formulario
|
||||
* el objeto del modelo
|
||||
|
||||
* la clase
|
||||
* la clase base
|
||||
* la clase padre
|
||||
* la subclase
|
||||
* la clase hija
|
||||
* la clase hermana
|
||||
* el método de clase
|
||||
|
||||
* el header
|
||||
* los headers
|
||||
* el header de autorización
|
||||
* el header `Authorization`
|
||||
* el header Forwarded
|
||||
|
||||
* el sistema de inyección de dependencias
|
||||
* la dependencia
|
||||
* el dependable
|
||||
* el dependiente
|
||||
|
||||
* limitado por I/O
|
||||
* limitado por CPU
|
||||
* concurrencia
|
||||
* paralelismo
|
||||
* multiprocesamiento
|
||||
|
||||
* la variable de entorno
|
||||
* la variable de entorno
|
||||
* el `PATH`
|
||||
* la variable `PATH`
|
||||
|
||||
* la autenticación
|
||||
* el proveedor de autenticación
|
||||
* la autorización
|
||||
* el formulario de autorización
|
||||
* el proveedor de autorización
|
||||
* el usuario se autentica
|
||||
* el sistema autentica al usuario
|
||||
|
||||
* la CLI
|
||||
* la interfaz de línea de comandos
|
||||
|
||||
* el servidor
|
||||
* el cliente
|
||||
|
||||
* el proveedor en la nube
|
||||
* el servicio en la nube
|
||||
|
||||
* el desarrollo
|
||||
* las etapas de desarrollo
|
||||
|
||||
* el dict
|
||||
* el diccionario
|
||||
* la enumeración
|
||||
* el enum
|
||||
* el miembro del enum
|
||||
|
||||
* el codificador
|
||||
* el decodificador
|
||||
* codificar
|
||||
* decodificar
|
||||
|
||||
* la excepción
|
||||
* lanzar
|
||||
|
||||
* la expresión
|
||||
* el statement
|
||||
|
||||
* el frontend
|
||||
* el backend
|
||||
|
||||
* la discusión de GitHub
|
||||
* el issue de GitHub
|
||||
|
||||
* el rendimiento
|
||||
* la optimización de rendimiento
|
||||
|
||||
* el tipo de retorno
|
||||
* el valor de retorno
|
||||
|
||||
* la seguridad
|
||||
* el esquema de seguridad
|
||||
|
||||
* la tarea
|
||||
* la tarea en segundo plano
|
||||
* la función de tarea
|
||||
|
||||
* la plantilla
|
||||
* el motor de plantillas
|
||||
|
||||
* la anotación de tipos
|
||||
* la anotación de tipos
|
||||
|
||||
* el worker del servidor
|
||||
* el worker de Uvicorn
|
||||
* el Gunicorn Worker
|
||||
* el worker process
|
||||
* la worker class
|
||||
* la carga de trabajo
|
||||
|
||||
* el despliegue
|
||||
* desplegar
|
||||
|
||||
* el SDK
|
||||
* el kit de desarrollo de software
|
||||
|
||||
* el `APIRouter`
|
||||
* el `requirements.txt`
|
||||
* el Bearer Token
|
||||
* el cambio incompatible
|
||||
* el bug
|
||||
* el botón
|
||||
* el invocable
|
||||
* el código
|
||||
* el commit
|
||||
* el context manager
|
||||
* la corrutina
|
||||
* la sesión de base de datos
|
||||
* el disco
|
||||
* el dominio
|
||||
* el motor
|
||||
* el X falso
|
||||
* el método HTTP GET
|
||||
* el ítem
|
||||
* el paquete
|
||||
* el lifespan
|
||||
* el bloqueo
|
||||
* el middleware
|
||||
* la aplicación móvil
|
||||
* el módulo
|
||||
* el montaje
|
||||
* la red
|
||||
* el origen
|
||||
* el override
|
||||
* el payload
|
||||
* el procesador
|
||||
* la propiedad
|
||||
* el proxy
|
||||
* el pull request
|
||||
* la query
|
||||
* la RAM
|
||||
* la máquina remota
|
||||
* el código de estado
|
||||
* el string
|
||||
* la etiqueta
|
||||
* el framework web
|
||||
* el comodín
|
||||
* devolver
|
||||
* validar
|
||||
|
||||
////
|
||||
|
||||
//// tab | Información
|
||||
|
||||
Esta es una lista no completa y no normativa de términos (mayormente) técnicos vistos en la documentación. Puede ayudar a la persona que diseña el prompt a identificar para qué términos el LLM necesita una mano. Por ejemplo cuando sigue revirtiendo una buena traducción a una traducción subóptima. O cuando tiene problemas conjugando/declinando un término en tu idioma.
|
||||
|
||||
Mira p. ej. la sección `### List of English terms and their preferred German translations` en `docs/de/llm-prompt.md`.
|
||||
|
||||
////
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
# FastAPI Cloud { #fastapi-cloud }
|
||||
|
||||
Puedes desplegar tu app de FastAPI en <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> con un solo comando; ve y únete a la lista de espera si aún no lo has hecho. 🚀
|
||||
|
||||
## Iniciar sesión { #login }
|
||||
|
||||
Asegúrate de que ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉).
|
||||
|
||||
Luego inicia sesión:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi login
|
||||
|
||||
You are logged in to FastAPI Cloud 🚀
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## Desplegar { #deploy }
|
||||
|
||||
Ahora despliega tu app, con un solo comando:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi deploy
|
||||
|
||||
Deploying to FastAPI Cloud...
|
||||
|
||||
✅ Deployment successful!
|
||||
|
||||
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
¡Eso es todo! Ahora puedes acceder a tu app en esa URL. ✨
|
||||
|
||||
## Acerca de FastAPI Cloud { #about-fastapi-cloud }
|
||||
|
||||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** está creado por el mismo autor y equipo detrás de **FastAPI**.
|
||||
|
||||
Agiliza el proceso de **crear**, **desplegar** y **acceder** a una API con el mínimo esfuerzo.
|
||||
|
||||
Aporta la misma **experiencia de desarrollador** de crear apps con FastAPI al **desplegarlas** en la nube. 🎉
|
||||
|
||||
También se encargará de la mayoría de las cosas que necesitas al desplegar una app, como:
|
||||
|
||||
* HTTPS
|
||||
* Replicación, con autoescalado basado en requests
|
||||
* etc.
|
||||
|
||||
FastAPI Cloud es el sponsor principal y proveedor de financiación de los proyectos open source de *FastAPI and friends*. ✨
|
||||
|
||||
## Desplegar en otros proveedores de la nube { #deploy-to-other-cloud-providers }
|
||||
|
||||
FastAPI es open source y está basado en estándares. Puedes desplegar apps de FastAPI en cualquier proveedor de la nube que elijas.
|
||||
|
||||
Sigue las guías de tu proveedor de la nube para desplegar apps de FastAPI con ellos. 🤓
|
||||
|
||||
## Despliega tu propio servidor { #deploy-your-own-server }
|
||||
|
||||
También te enseñaré más adelante en esta guía de **Despliegue** todos los detalles, para que puedas entender qué está pasando, qué tiene que ocurrir o cómo desplegar apps de FastAPI por tu cuenta, también con tus propios servidores. 🤓
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# Usar los códigos de estado antiguos 403 para errores de autenticación { #use-old-403-authentication-error-status-codes }
|
||||
|
||||
Antes de FastAPI versión `0.122.0`, cuando las utilidades de seguridad integradas devolvían un error al cliente después de una autenticación fallida, usaban el código de estado HTTP `403 Forbidden`.
|
||||
|
||||
A partir de FastAPI versión `0.122.0`, usan el código de estado HTTP `401 Unauthorized`, más apropiado, y devuelven un `WWW-Authenticate` header adecuado en la response, siguiendo las especificaciones HTTP, <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>.
|
||||
|
||||
Pero si por alguna razón tus clientes dependen del comportamiento anterior, puedes volver a él sobrescribiendo el método `make_not_authenticated_error` en tus clases de seguridad.
|
||||
|
||||
Por ejemplo, puedes crear una subclase de `HTTPBearer` que devuelva un error `403 Forbidden` en lugar del `401 Unauthorized` por defecto:
|
||||
|
||||
{* ../../docs_src/authentication_error_status_code/tutorial001_an_py39.py hl[9:13] *}
|
||||
|
||||
/// tip | Consejo
|
||||
|
||||
Ten en cuenta que la función devuelve la instance de la excepción, no la lanza. El lanzamiento se hace en el resto del código interno.
|
||||
|
||||
///
|
||||
|
|
@ -0,0 +1,133 @@
|
|||
# Migra de Pydantic v1 a Pydantic v2 { #migrate-from-pydantic-v1-to-pydantic-v2 }
|
||||
|
||||
Si tienes una app de FastAPI antigua, podrías estar usando Pydantic versión 1.
|
||||
|
||||
FastAPI ha tenido compatibilidad con Pydantic v1 o v2 desde la versión 0.100.0.
|
||||
|
||||
Si tenías instalado Pydantic v2, lo usaba. Si en cambio tenías Pydantic v1, usaba ese.
|
||||
|
||||
Pydantic v1 está deprecado y su soporte se eliminará en las próximas versiones de FastAPI, deberías migrar a Pydantic v2. Así obtendrás las funcionalidades, mejoras y correcciones más recientes.
|
||||
|
||||
/// warning | Advertencia
|
||||
|
||||
Además, el equipo de Pydantic dejó de dar soporte a Pydantic v1 para las versiones más recientes de Python, comenzando con Python 3.14.
|
||||
|
||||
Si quieres usar las funcionalidades más recientes de Python, tendrás que asegurarte de usar Pydantic v2.
|
||||
|
||||
///
|
||||
|
||||
Si tienes una app de FastAPI antigua con Pydantic v1, aquí te muestro cómo migrarla a Pydantic v2 y las nuevas funcionalidades en FastAPI 0.119.0 para ayudarte con una migración gradual.
|
||||
|
||||
## Guía oficial { #official-guide }
|
||||
|
||||
Pydantic tiene una <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">Guía de migración</a> oficial de v1 a v2.
|
||||
|
||||
También incluye qué cambió, cómo las validaciones ahora son más correctas y estrictas, posibles consideraciones, etc.
|
||||
|
||||
Puedes leerla para entender mejor qué cambió.
|
||||
|
||||
## Tests { #tests }
|
||||
|
||||
Asegúrate de tener [tests](../tutorial/testing.md){.internal-link target=_blank} para tu app y de ejecutarlos en integración continua (CI).
|
||||
|
||||
Así podrás hacer la actualización y asegurarte de que todo sigue funcionando como esperas.
|
||||
|
||||
## `bump-pydantic` { #bump-pydantic }
|
||||
|
||||
En muchos casos, cuando usas modelos de Pydantic normales sin personalizaciones, podrás automatizar gran parte del proceso de migración de Pydantic v1 a Pydantic v2.
|
||||
|
||||
Puedes usar <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> del mismo equipo de Pydantic.
|
||||
|
||||
Esta herramienta te ayudará a cambiar automáticamente la mayor parte del código que necesita cambiarse.
|
||||
|
||||
Después de esto, puedes ejecutar los tests y revisa si todo funciona. Si es así, ya terminaste. 😎
|
||||
|
||||
## Pydantic v1 en v2 { #pydantic-v1-in-v2 }
|
||||
|
||||
Pydantic v2 incluye todo lo de Pydantic v1 como un submódulo `pydantic.v1`.
|
||||
|
||||
Esto significa que puedes instalar la versión más reciente de Pydantic v2 e importar y usar los componentes viejos de Pydantic v1 desde ese submódulo, como si tuvieras instalado el Pydantic v1 antiguo.
|
||||
|
||||
{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}
|
||||
|
||||
### Compatibilidad de FastAPI con Pydantic v1 en v2 { #fastapi-support-for-pydantic-v1-in-v2 }
|
||||
|
||||
Desde FastAPI 0.119.0, también hay compatibilidad parcial para Pydantic v1 desde dentro de Pydantic v2, para facilitar la migración a v2.
|
||||
|
||||
Así que podrías actualizar Pydantic a la última versión 2 y cambiar los imports para usar el submódulo `pydantic.v1`, y en muchos casos simplemente funcionaría.
|
||||
|
||||
{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}
|
||||
|
||||
/// warning | Advertencia
|
||||
|
||||
Ten en cuenta que, como el equipo de Pydantic ya no da soporte a Pydantic v1 en versiones recientes de Python, empezando por Python 3.14, usar `pydantic.v1` tampoco está soportado en Python 3.14 y superiores.
|
||||
|
||||
///
|
||||
|
||||
### Pydantic v1 y v2 en la misma app { #pydantic-v1-and-v2-on-the-same-app }
|
||||
|
||||
No está soportado por Pydantic tener un modelo de Pydantic v2 con sus propios campos definidos como modelos de Pydantic v1 o viceversa.
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "❌ Not Supported"
|
||||
direction TB
|
||||
subgraph V2["Pydantic v2 Model"]
|
||||
V1Field["Pydantic v1 Model"]
|
||||
end
|
||||
subgraph V1["Pydantic v1 Model"]
|
||||
V2Field["Pydantic v2 Model"]
|
||||
end
|
||||
end
|
||||
|
||||
style V2 fill:#f9fff3
|
||||
style V1 fill:#fff6f0
|
||||
style V1Field fill:#fff6f0
|
||||
style V2Field fill:#f9fff3
|
||||
```
|
||||
|
||||
...pero puedes tener modelos separados usando Pydantic v1 y v2 en la misma app.
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "✅ Supported"
|
||||
direction TB
|
||||
subgraph V2["Pydantic v2 Model"]
|
||||
V2Field["Pydantic v2 Model"]
|
||||
end
|
||||
subgraph V1["Pydantic v1 Model"]
|
||||
V1Field["Pydantic v1 Model"]
|
||||
end
|
||||
end
|
||||
|
||||
style V2 fill:#f9fff3
|
||||
style V1 fill:#fff6f0
|
||||
style V1Field fill:#fff6f0
|
||||
style V2Field fill:#f9fff3
|
||||
```
|
||||
|
||||
En algunos casos, incluso es posible tener modelos de Pydantic v1 y v2 en la misma path operation de tu app de FastAPI:
|
||||
|
||||
{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}
|
||||
|
||||
En el ejemplo anterior, el modelo de entrada es un modelo de Pydantic v1 y el modelo de salida (definido en `response_model=ItemV2`) es un modelo de Pydantic v2.
|
||||
|
||||
### Parámetros de Pydantic v1 { #pydantic-v1-parameters }
|
||||
|
||||
Si necesitas usar algunas de las herramientas específicas de FastAPI para parámetros como `Body`, `Query`, `Form`, etc. con modelos de Pydantic v1, puedes importarlas de `fastapi.temp_pydantic_v1_params` mientras terminas la migración a Pydantic v2:
|
||||
|
||||
{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}
|
||||
|
||||
### Migra por pasos { #migrate-in-steps }
|
||||
|
||||
/// tip | Consejo
|
||||
|
||||
Primero prueba con `bump-pydantic`; si tus tests pasan y eso funciona, entonces terminaste con un solo comando. ✨
|
||||
|
||||
///
|
||||
|
||||
Si `bump-pydantic` no funciona para tu caso, puedes usar la compatibilidad de modelos Pydantic v1 y v2 en la misma app para hacer la migración a Pydantic v2 de forma gradual.
|
||||
|
||||
Podrías primero actualizar Pydantic para usar la última versión 2 y cambiar los imports para usar `pydantic.v1` para todos tus modelos.
|
||||
|
||||
Luego puedes empezar a migrar tus modelos de Pydantic v1 a v2 por grupos, en pasos graduales. 🚶
|
||||
Loading…
Reference in New Issue