Concepto clave
La documentación automática con OpenAPI en FastAPI es como tener un arquitecto que genera planos detallados de tu edificio mientras lo construyes. OpenAPI es una especificación estándar que describe APIs RESTful, y FastAPI la genera automáticamente basándose en tus modelos Pydantic, parámetros de ruta y decoradores. Esto no es solo documentación estática; es un contrato vivo que especifica endpoints, parámetros, respuestas y esquemas de datos.
Imagina que estás construyendo una API para un sistema bancario. Sin OpenAPI, tendrías que escribir manualmente documentación que rápidamente quedaría obsoleta. Con FastAPI, cada vez que defines una operación como @app.get("/accounts/{account_id}"), el framework analiza tus tipos de datos, validaciones y descripciones para generar un esquema OpenAPI completo. Esto permite herramientas como Swagger UI y ReDoc crear interfaces interactivas donde los desarrolladores pueden probar endpoints directamente, similar a cómo un banco ofrece simuladores en línea para préstamos antes de aplicar.
Cómo funciona en la práctica
FastAPI integra OpenAPI de forma nativa. Cuando inicias tu aplicación, FastAPI recopila metadatos de todas las rutas definidas, incluyendo parámetros de consulta, cuerpos de solicitud usando Pydantic, y respuestas. Este proceso ocurre durante el tiempo de ejecución, generando un documento JSON en /openapi.json que sigue la especificación OpenAPI 3.0. Para personalizar, puedes modificar este documento mediante el objeto app.openapi o usar decoradores como @app.get(..., response_model=...) para refinar la documentación.
Paso a paso: primero, defines tus modelos Pydantic con anotaciones de tipo y descripciones. Luego, en los endpoints, usas parámetros con tipos específicos y decoradores para operaciones HTTP. FastAPI combina esto para producir la documentación. Por ejemplo, al agregar un parámetro limit: int = Query(10, description="Número máximo de resultados"), FastAPI incluye esta descripción en el esquema OpenAPI, mejorando la claridad para los consumidores de la API.
Codigo en accion
Aquí tienes un ejemplo funcional que muestra la generación básica y personalización:
from fastapi import FastAPI, Query, HTTPException
from pydantic import BaseModel, Field
from typing import Optional
app = FastAPI(title="API Bancaria", version="1.0.0", description="API para gestionar cuentas bancarias")
class Account(BaseModel):
id: int = Field(..., description="ID único de la cuenta")
balance: float = Field(..., ge=0, description="Saldo actual en dólares")
owner: str = Field(..., min_length=1, description="Nombre del titular")
accounts_db = {1: Account(id=1, balance=1000.0, owner="Juan Pérez")}
@app.get("/accounts/{account_id}", response_model=Account, summary="Obtener cuenta por ID", tags=["Cuentas"])
async def get_account(account_id: int = Query(..., description="ID de la cuenta a recuperar")):
"""
Recupera los detalles de una cuenta bancaria específica.
- **account_id**: ID único de la cuenta
"""
account = accounts_db.get(account_id)
if not account:
raise HTTPException(status_code=404, detail="Cuenta no encontrada")
return account
# Personalización del esquema OpenAPI
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = app.openapi()
openapi_schema["info"]["x-logo"] = {"url": "https://example.com/logo.png"}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapiAntes de la personalización, el esquema OpenAPI solo incluye metadatos básicos. Después de agregar custom_openapi, añadimos un logo personalizado, demostrando cómo extender la documentación para branding o integraciones específicas.
Errores comunes
- Documentación desactualizada: No actualizar descripciones en modelos o endpoints después de cambios en la lógica. Para evitarlo, usa anotaciones de tipo estrictas y revisa regularmente
/docs. - Falta de validaciones en Pydantic: Omitir
Fieldcon descripciones o restricciones comoge, lo que genera documentación incompleta. Siempre define campos con metadata relevante. - Ignorar tags y summary: No usar parámetros como
tagsosummaryen decoradores, resultando en una documentación desorganizada. Agrupa endpoints relacionados y provee resúmenes claros. - Sobrecarga de personalización: Modificar excesivamente el esquema OpenAPI, complicando el mantenimiento. Enfócate en cambios esenciales como metadatos o extensiones específicas.
- No probar la documentación interactiva: Asumir que la generación automática es perfecta sin validar en Swagger UI. Prueba los endpoints desde
/docspara asegurar coherencia.
Checklist de dominio
- Generar y acceder al esquema OpenAPI en
/openapi.jsonpara verificar su estructura. - Usar modelos Pydantic con
Fieldpara documentar propiedades y validaciones. - Personalizar metadatos de la API (título, versión, descripción) en la instancia de FastAPI.
- Agregar tags y summary a los endpoints para organizar la documentación.
- Modificar el esquema OpenAPI mediante
app.openapipara extensiones personalizadas. - Probar la documentación interactiva en
/docs(Swagger UI) y/redoc. - Integrar la documentación en pipelines de CI/CD para validación automática.
Implementar y Personalizar Documentación para una API de Gestión de Productos
En este ejercicio, crearás una API FastAPI para gestionar productos y personalizarás su documentación OpenAPI. Sigue estos pasos:
- Crea un nuevo proyecto FastAPI y define un modelo Pydantic
Productcon campos:id(int),name(str con descripción),price(float con validación positiva), ycategory(str opcional). - Implementa endpoints para:
GET /products: Listar todos los productos, con parámetro de consultacategoryopcional.POST /products: Crear un nuevo producto, usando el modelo en el cuerpo de la solicitud.GET /products/{product_id}: Obtener un producto por ID, con manejo de errores si no existe.
- Personaliza la documentación:
- Configura el título de la API como "API de Productos" y añade una descripción.
- Usa tags para agrupar endpoints (ej., "Productos").
- Modifica el esquema OpenAPI para incluir un campo personalizado
"contact"con email de soporte.
- Ejecuta la aplicación y verifica la documentación en
/docs, probando los endpoints interactivamente.
- Usa
Fieldde Pydantic para añadir descripciones a los campos del modelo. - Para personalizar OpenAPI, define una función que modifique
app.openapi_schemaantes de devolverlo. - Prueba el parámetro de consulta en Swagger UI para ver cómo se refleja en la documentación.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.