4.2 · API web con Flask y FastAPI

Nivel 4 · Especializaciones (Web, Data, IA, Automatización)

4.2API web con Flask y FastAPI

Objetivo: Crear una API REST ligera con Flask o FastAPI (recursos JSON, validación Pydantic, documentación automática) — para servir vuestros datos a cualquier cliente en lugar de encerrarlos en páginas.
Tiempo estimado: 13 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • API = contrato JSON : recursos (GET /articles, POST /articles) y estados que dicen la verdad (200 leído, 201 creado, 400 inválido, 404 no encontrado).
  • Flask = libertad minimalista (servicios pequeños, aprender) ; FastAPI = moderno : type hints → validación automática + documentación interactiva /docs, async nativo.
  • Reflejo de Nabil : diseñar recursos y estados ANTES del código, validar toda entrada con Pydantic, probar con TestClient.

Mini-caso hilado — Nabil sirve sus ventas en JSON

El back-office Django de Nabil (4.1) es muy útil, pero un colega quiere las cifras de ventas en un cuadro de mando separado : necesita JSON, no páginas HTML. Nabil construye una pequeña API FastAPI en Argel : GET /ventes para leer, POST /ventes (201 si creado, 400 si inválido) para añadir, con validación Pydantic y documentación interactiva en /docs. El colega explora la API solo, sin llamar a Nabil. Segundo hito del hilo : los mismos datos, servidos a todos los clientes.

Continuación del caso 4.1 — Nabil separa sus datos de su visualización.

1. API REST : recursos, JSON y estados

Una API REST expone datos en JSON mediante URL y métodos HTTP : GET /ventes lee, POST /ventes crea, y el estado HTTP dice el resultado — 200 leído, 201 creado, 400 entrada inválida, 404 no encontrado. El JSON (claves/valores, listas) corresponde exactamente a los dict y list de Python : es el formato universal. Nabil diseña primero sus recursos y sus estados — el contrato — antes de escribir la menor línea.

2. Flask minimalista, FastAPI moderno

Flask es un micro-framework : una ruta = una URL hacia una función, libertad total, ideal para aprender y para servicios pequeños. FastAPI es su sucesor moderno : los type hints (titre: str) alimentan a Pydantic, que valida cada entrada automáticamente, la documentación OpenAPI se genera sola (página interactiva /docs) y el async nativo (async/await) procesa las peticiones simultáneas sin bloquear. Nabil elige FastAPI para su API de ventas : validación + documentación viva sin esfuerzo.

Y lo fiabilizamos : probar cada ruta con pytest + TestClient (POST válido → 201, POST inválido → 400) y documentar vía /docs en lugar de un documento Word que caduca. Una API probada y autodocumentada es un contrato que los colegas usan sin molestaros.

Error frecuente de interpretación: « Devolver 200 para todo, el cuerpo de la respuesta basta ». No. El estado HTTP es la primera información que lee el cliente : un 200 en una creación impide distinguir leído/creado, un 200 en un error rompe toda gestión automática de errores. Los estados que dicen la verdad (201, 400, 404) son el contrato ; el JSON solo es el contenido.
El circuito de una petición API Ruta → validación → lógica → JSON + estado Ruta URL + métodohacia la funciónValidación (Pydantic) ¿Entradaconforme? si no, 400Lógica Leer o almacenarel recursoRespuesta JSON + estado 200 leído,201 creado, 404 faltante
Ruta → validación → lógica → JSON + estado
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Nabil declara sus rutas : URL + método HTTP hacia una función. 2) Pydantic valida cada entrada desde los type hints (400 si inválida). 3) La función lee o almacena el recurso. 4) La API responde en JSON con el estado correcto. Lección : contrato primero, validación automática, documentación viva.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — La API de ventas de Nabil

Los gestos de Nabil con las API reales de FastAPI :

class Vente(BaseModel): ville: str; montant: float  # validado auto
@app.get("/ventes") → lista en JSON (200)
@app.post("/ventes", status_code=201) → crea (201) o 400 si inválida
uvicorn main:app --reload  +  doc en /docs

Lectura : modelo validado, dos rutas, estados explícitos.

Lección : los hints dan validación + documentación.

Vocabulario de la sección

API REST
Datos expuestos en JSON mediante URL y métodos HTTP (GET leer, POST crear), con estados que dicen el resultado.

Ejemplo sencillo: La API de Nabil : GET /ventes lee, POST /ventes crea (201).

Lo que no es: páginas HTML reservadas a una sola visualización.

Reflejo: diseñar recursos + estados antes del código.

Flask
Micro-framework Python minimalista : una ruta = una URL hacia una función ; libertad total, ideal para aprender y servicios pequeños.

Ejemplo sencillo: Nabil maqueta allí su primer prototipo de API en pocas líneas.

Lo que no es: un framework completo que impone admin y ORM.

Reflejo: ¿servicio pequeño a medida? Flask basta.

FastAPI + Pydantic
Framework API moderno : los type hints alimentan a Pydantic, que valida las entradas, genera la documentación OpenAPI y soporta async.

Ejemplo sencillo: La Venta de Nabil se valida (importe numérico requerido) sin código de control.

Lo que no es: entradas aceptadas sin verificación.

Reflejo: tipar cada modelo de entrada, probar el 400.

Estados HTTP
Códigos de resultado : 200 leído, 201 creado, 400 entrada inválida, 404 no encontrado — el contrato que el cliente lee primero.

Ejemplo sencillo: El POST de Nabil responde 201 si creado, 400 si falta el importe.

Lo que no es: un 200 devuelto para todo, éxitos como errores.

Reflejo: cada ruta : ¿qué estado para qué caso?

En la práctica — En práctica — Servir una API FastAPI

  1. Instalad fastapi y uvicorn en un venv y luego declarad un modelo Pydantic (p. ej. Vente : ville str, montant float).
  2. Añadid GET /ventes (leer, 200) y POST /ventes (crear, status_code=201) sobre una lista en memoria.
  3. Lanzad con « uvicorn main:app --reload » y explorad la documentación interactiva en /docs : probad desde el navegador.
  4. Escribid 2 pruebas (pytest + TestClient) : POST válido → 201, POST inválido → 400 ; corregid hasta el verde.
Servís una API REST validada, documentada y probada : vuestros datos se vuelven consumibles por cualquier cliente.

Guion listo para decir — presentar su API (30 s)

« Soy Nabil : nuestras ventas se sirven en JSON — GET para leer, POST en 201 para crear, 400 si la entrada es inválida. Pydantic lo valida todo, la documentación en /docs está actualizada de oficio y las pruebas blindan el contrato. »

Para decir en demo ; mostrad /docs en directo.

Modelo copiar-pegar — API FastAPI (código probado)

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Vente(BaseModel):
    ville: str
    montant: float

VENTES: list[Vente] = []

@app.get("/ventes")
def lister():
    return VENTES

@app.post("/ventes", status_code=201)
def creer(vente: Vente):
    VENTES.append(vente)
    return vente

# Lanzar : uvicorn main:app --reload
# Documentación interactiva : /docs
# Prueba :
# from fastapi.testclient import TestClient
# client = TestClient(app)
# assert client.post("/ventes", json={"ville": "Alger", "montant": 1200.5}).status_code == 201
# assert client.post("/ventes", json={"ville": "Alger"}).status_code == 422

Prototipo rápido

Flask en pocas líneas : una ruta, JSON, y vuestra idea es demostrable esta noche.

API de equipo

Como Nabil : FastAPI + Pydantic en todas partes, /docs como documentación oficial, TestClient por rutina.

Tráfico intenso

Pasad las vistas pesadas a async (async def) : las esperas de red ya no acumulan las peticiones.

Datos Django

Conservad vuestros modelos Django (4.1) y exponedlos en JSON : mismos datos, nuevo contrato, cero reescritura.

Prudencia: Una API abierta es una puerta : validad toda entrada con Pydantic y devolved solo lo necesario, nunca datos personales superfluos. Contenido pedagógico, ejemplos con datos ficticios.

✓ Buenas prácticas

  • Diseñar el contrato (recursos + estados) antes del código.
  • Validar toda entrada con Pydantic.
  • Probar con TestClient y documentar vía /docs.

✗ Errores frecuentes

  • Devolver 200 para todo, éxitos como errores.
  • Aceptar entradas no validadas.
  • Mantener una documentación separada que caduca.

Puntos clave

  • API REST = JSON vía URL + MÉTODOS HTTP ; ESTADOS que dicen la verdad (200/201/400/404).
  • FLASK minimalista (libertad, servicios pequeños) ; FASTAPI moderno (validación automática, /docs, async).
  • PYDANTIC valida desde los type hints ; TESTCLIENT blinda el contrato.
  • Mismos datos, varios clientes : separar la exposición de la visualización.

Reto 48h — aplica mañana

Exponed vuestros propios datos : GET + POST con modelo Pydantic, 201/400 correctos, /docs explorada y 2 pruebas en verde.

Lista de salida de la sección
  • Puedo citar recursos, JSON, estados 200/201/400/404.
  • Sé explicar la validación Pydantic y /docs.
  • Tengo 1 API probada que sirve mis datos.
Autoevaluación 1-5 : ¿devuelve cada ruta el estado correcto?¿están validadas todas mis entradas?

Preguntas frecuentes

¿Por qué el JSON está en todas partes en las API?

Porque es un formato de texto ligero en claves/valores y listas que corresponde exactamente a los dict y list de Python : legible por el humano, manipulable en una línea de código, comprendido por todos los lenguajes. El cliente recibe JSON, lo convierte en objetos nativos y trabaja — sin controlador ni formato propietario.

¿Para qué sirve el async (async/await) en FastAPI?

Para procesar muchas peticiones simultáneas sin bloquear : mientras una petición espera a la base o a la red, el servidor procesa las demás en lugar de esperar. Para una API que lee datos o llama a servicios, el async aumenta claramente el rendimiento con el mismo servidor — sin cambiar la lógica.

Comprueba tu comprensión

¿Qué expone una API REST a sus clientes?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 4Preguntas inéditas y más difíciles para validar tus conocimientos