Browse Source
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>pull/14534/head
committed by
GitHub
4 changed files with 718 additions and 0 deletions
@ -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