Saltar al contenido

Lección 17 de 25 · Lectura y práctica

Generar Documentación Automática con OpenAPI y Personalización

Concepto claveLa 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.

Del concepto a la práctica

Taller de esta lección

OpenAPI debe describir el contrato que realmente mantiene la ruta. Los nombres de campos, restricciones y respuestas permiten a otro equipo prever el comportamiento sin leer la implementación. Personalizar no significa inventar operaciones, sino añadir contexto verificable como una descripción y un ejemplo coherente.

Ejemplo resuelto

La ruta GET /articles/{article_id} declara article_id entero, respuesta 200 con ArticleResponse y 404 sin artículo. El ejemplo usa id=44, title="Rutas" y un cuerpo breve que coincide con el esquema.

En el decorador debes declarar la respuesta adicional; FastAPI no infiere automáticamente todos los errores lanzados. Con ArticleResponse definido en el proyecto:

python
@app.get("/articles/{article_id}", response_model=ArticleResponse,
         responses={404: {"description": "Artículo inexistente"}})
async def read_article(article_id: int):
    article = await service.get(article_id)
    if article is None:
        raise HTTPException(status_code=404, detail="Artículo inexistente")
    return article

Importa HTTPException desde fastapi y usa un ID 44 existente y 999 ausente. Inspecciona app.openapi()["paths"]["/articles/{article_id}"]["get"]["responses"] para confirmar 200, 404 y la validación 422.

Pruébalo

  1. Añade descripciones a parámetros y respuestas.

  2. Genera el esquema OpenAPI en memoria.

  3. Busca la operación y sus códigos.

  4. Compara el ejemplo con el modelo de respuesta.

Comprueba tu resultado

El esquema contiene 200 y 404, el tipo entero y los campos declarados; ningún ejemplo contradice la validación.

Error frecuente: documentar 201 cuando la ruta devuelve 200. Corrígelo alineando decorador, implementación y prueba del contrato.

Navegador, API y base de datos conectados por solicitudes, consultas y respuestas en sentidos opuestos.
CursaloMapa de práctica
Del navegador a los datos

El navegador envía una solicitud a la API. El servidor valida la operación y consulta los datos; después devuelve una respuesta que el navegador puede mostrar. La base de datos se comunica con el servidor y no directamente con el navegador.

Ver la infografía en tamaño completo ↗

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_openapi

Antes 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 Field con descripciones o restricciones como ge, lo que genera documentación incompleta. Siempre define campos con metadata relevante.
  • Ignorar tags y summary: No usar parámetros como tags o summary en 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 /docs para asegurar coherencia.

Checklist de dominio

  1. Generar y acceder al esquema OpenAPI en /openapi.json para verificar su estructura.
  2. Usar modelos Pydantic con Field para documentar propiedades y validaciones.
  3. Personalizar metadatos de la API (título, versión, descripción) en la instancia de FastAPI.
  4. Agregar tags y summary a los endpoints para organizar la documentación.
  5. Modificar el esquema OpenAPI mediante app.openapi para extensiones personalizadas.
  6. Probar la documentación interactiva en /docs (Swagger UI) y /redoc.
  7. 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:

  1. Crea un nuevo proyecto FastAPI y define un modelo Pydantic Product con campos: id (int), name (str con descripción), price (float con validación positiva), y category (str opcional).
  2. Implementa endpoints para:
    • GET /products: Listar todos los productos, con parámetro de consulta category opcional.
    • 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.
  3. 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.
  4. Ejecuta la aplicación y verifica la documentación en /docs, probando los endpoints interactivamente.
Pistas
  • Usa Field de Pydantic para añadir descripciones a los campos del modelo.
  • Para personalizar OpenAPI, define una función que modifique app.openapi_schema antes 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.

Sigue con Dominio Profesional de FastAPI: Construcción de APIs Escalables y Seguras

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.