Idea para llevarse: Hay que probar por separado JSON null/omisión y, en formularios, ausencia, cadena vacía, checkbox y archivos, siempre contra la versión final.

Una semana de cambios en el contrato HTTP

FastAPI publicó una secuencia inusualmente densa de cambios de comportamiento entre el 19 y el 23 de octubre. Las notas de 0.149 tratan los escalares vacíos de formularios como ausentes; 0.150 aplica esa lógica a archivos no seleccionados; 0.151 distingue null explícito de un valor omitido en cuerpos JSON (Body), no en formularios URL-encoded; y 0.160 extiende la configuración extra de un modelo a campos hermanos en la misma ubicación. No son cambios de documentación: pueden alterar qué entra en un modelo, qué se rechaza y qué queda marcado como proporcionado por el usuario.[5][2][3][6]

El giro importante de los booleanos

La versión 0.147 interpretó los booleanos omitidos en formularios como False, incluso cuando existía otro default. El 23 de octubre, 0.162 revirtió ese comportamiento: los campos bool y bool | None omitidos usan su default declarado o generan un error por ausencia, en consonancia con otros campos y Pydantic. Para un checkbox HTML, la nota recomienda declarar default False. Leer solo la versión intermedia llevaría a una conclusión equivocada sobre la final; las pruebas deben fijar exactamente qué release validan.[4][1]

Ausente, vacío y null no son intercambiables

Estas distinciones afectan a operaciones habituales como actualizaciones parciales, pero no ocurren en el mismo transporte. En un formulario, una cadena vacía puede significar que el usuario dejó un input sin contenido y la omisión puede significar que no se quiere modificar el campo. En JSON, null puede ser una intención explícita de borrar y la omisión conserva otro significado. Un literal null escrito en un formulario no equivale al valor JSON null. Las notas de 0.149 y 0.151 cambian cómo FastAPI traduce esas señales a Pydantic en sus respectivos cuerpos. El contrato debe probarse en el límite HTTP y por transporte, no solo llamando al modelo de Python directamente.[5][3]

Archivos y campos extra también cambian el borde

Con 0.150, un input de archivo no seleccionado se considera ausente: los campos requeridos fallan y los defaults se aplican, mientras que un archivo nombrado de cero bytes sigue aceptándose. Con 0.160, extra="forbid" rechaza campos fuera del modelo aunque otro parámetro los declare; allow los incorpora como extras y ignore los descarta. Estas reglas pueden modificar tanto la validación como los datos compartidos entre dependencias. Revisar un único endpoint feliz deja fuera los casos que precisamente cambiaron.[2][6]

Una batería mínima de contrato

Para cada endpoint JSON afectado conviene enviar null y omisión por separado. La batería de formularios es independiente: ausencia, cadena vacía, checkbox desmarcado, archivo vacío sin nombre y archivo nombrado de cero bytes. Después hay que comprobar status, contenido del modelo, model_dump(exclude_unset=True) y efectos en la base de datos. En formularios con modelos unidos o dependencias hermanas deben añadirse campos desconocidos. Las mismas pruebas deberían ejecutarse en 0.162 y en la versión previa para documentar la diferencia, con clientes OpenAPI regenerados si el esquema cambia.[5][2][3][6][1]

Límites y decisión de despliegue

Esta retrospectiva no ha ejecutado la batería ni cubre todas las versiones intermedias. Las notas sustentan los cambios descritos; la propuesta de aceptación es nuestro análisis. La decisión prudente es posponer la actualización si no existe una forma de observar esos casos y revertir, y corregir primero los endpoints que dependían de booleanos inferidos. La frecuencia de releases no es el riesgo en sí: el riesgo está en desplegar una nueva semántica sin evidencia del contrato que la aplicación necesita.[4][1]

Fuentes, fechas y alcance

Publicación real: 2 de noviembre de 2026. Periodo analizado: 19–23 de octubre de 2026. Análisis retrospectivo original basado en las notas primarias enumeradas; no incluye ejecución de benchmarks ni afirma cobertura exhaustiva del mes.

  1. fastapi/fastapi 0.162.0: notas oficiales de publicación. Consulta: .
  2. fastapi/fastapi 0.150.0: notas oficiales de publicación. Consulta: .
  3. fastapi/fastapi 0.151.0: notas oficiales de publicación. Consulta: .
  4. fastapi/fastapi 0.147.0: notas oficiales de publicación. Consulta: .
  5. fastapi/fastapi 0.149.0: notas oficiales de publicación. Consulta: .
  6. fastapi/fastapi 0.160.0: notas oficiales de publicación. Consulta: .

Suscribirse por RSS · Volver al archivo