Blog
Python Web ASGI FastAPI Starlette

¿Qué es Starlette y por qué plataformas como FastAPI lo usan?

Starlette es el corazón asíncrono sobre el que se construyen frameworks modernos de Python como FastAPI. Descubre qué es, cómo funciona y por qué se ha convertido en la base de referencia para APIs de alto rendimiento.

Raul Mauricio Uñate Raul Mauricio Uñate · 29 de mayo de 2026
¿Qué es Starlette y por qué plataformas como FastAPI lo usan?

Introducción

Cuando usas FastAPI para construir una API REST en Python, es fácil dar por sentado la magia que ocurre por debajo. Sin embargo, gran parte de esa magia tiene nombre propio: Starlette. Starlette es un framework/toolkit ASGI ligero y de alto rendimiento que actúa como el motor interno de FastAPI y de otros proyectos del ecosistema Python moderno. Entender qué es Starlette es entender los cimientos sobre los que se construyen las APIs más rápidas escritas en Python hoy en día.

¿Qué es ASGI y por qué importa?

Antes de hablar de Starlette, hay que entender el estándar sobre el que vive: ASGI (Asynchronous Server Gateway Interface). ASGI es el sucesor de WSGI y define cómo un servidor web se comunica con una aplicación Python de forma asíncrona.

La diferencia clave con WSGI (usado por Flask o Django tradicional) es que ASGI permite manejar múltiples solicitudes concurrentemente sin bloquear el hilo principal, aprovechando async/await de Python.

Comparación rápida:

Característica WSGI (Flask, Django clásico) ASGI (Starlette, FastAPI)
Concurrencia Hilos / procesos async/await nativo
WebSockets No nativo Soportado
Rendimiento I/O Limitado Alto
Servidor típico Gunicorn Uvicorn, Hypercorn

¿Qué es Starlette?

Starlette es un framework ASGI minimalista creado por Tom Christie (el mismo autor de Django REST Framework). Fue diseñado con un objetivo claro: proveer los bloques fundamentales para construir servicios web asíncronos en Python sin imponer demasiadas opiniones sobre la arquitectura final.

Sus características principales son:

  • Enrutamiento de peticiones HTTP y WebSocket
  • Middlewares (CORS, sesiones, autenticación, etc.)
  • Soporte nativo para WebSockets
  • Manejo de solicitudes y respuestas tipadas
  • Background Tasks para ejecutar tareas después de devolver la respuesta
  • Static Files y Templates con Jinja2
  • Testing integrado mediante httpx
  • Altamente extensible y composable
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
import uvicorn

async def homepage(request):
    return JSONResponse({"mensaje": "Hola desde Starlette"})

app = Starlette(routes=[
    Route("/", homepage),
])

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

Con solo estas pocas líneas tienes una aplicación ASGI funcional, sin dependencias pesadas ni configuración compleja.

¿Por qué FastAPI usa Starlette como base?

FastAPI no reinventó la rueda. En cambio, Sebastián Ramírez tomó Starlette como fundación y le añadió encima una capa de productividad para desarrolladores:

  • Validación automática de datos con Pydantic
  • Generación de documentación (Swagger UI y ReDoc) a partir de type hints
  • Inyección de dependencias declarativa
  • Serialización/deserialización automática de JSON

En la práctica, cuando escribes código en FastAPI, el objeto app es una instancia de una clase que hereda directamente de Starlette:

# Simplificación del código fuente de FastAPI
from starlette.applications import Starlette

class FastAPI(Starlette):
    def __init__(self, ...):
        super().__init__(...)
        # Lógica adicional de FastAPI

Esto significa que toda la maquinaria de routing, middlewares, WebSockets y manejo de requests que conoces en FastAPI proviene de Starlette. FastAPI es, esencialmente, Starlette + Pydantic + documentación automática.

Starlette por sí solo: ¿cuándo usarlo directamente?

Si bien FastAPI cubre la mayoría de los casos de uso, usar Starlette directamente tiene sentido cuando:

  • Necesitas un microservicio ultra-ligero sin validación de esquemas
  • Quieres construir tu propio framework sobre ASGI
  • Requieres control total sobre el ciclo de vida de la aplicación
  • Estás construyendo proxies o gateways HTTP personalizados
from starlette.middleware.cors import CORSMiddleware
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import JSONResponse

async def salud(request):
    return JSONResponse({"status": "ok"})

app = Starlette(routes=[Route("/health", salud)])

# Agregar middleware directamente
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["GET"],
)

Rendimiento: ¿qué tan rápido es?

Starlette consistentemente aparece entre los frameworks Python más rápidos en benchmarks independientes como TechEmpower Framework Benchmarks. Su velocidad proviene de:

  1. Uvicorn como servidor ASGI (basado en uvloop y httptools)
  2. Uso nativo de asyncio sin capas de abstracción pesadas
  3. Overhead mínimo por solicitud

FastAPI hereda este rendimiento directamente, lo que explica por qué puede competir con frameworks de Go o Node.js en escenarios con alta carga de I/O.

Ecosistema que usa Starlette

Starlette no es exclusivo de FastAPI. Otros proyectos y herramientas relevantes del ecosistema Python lo utilizan:

  • FastAPI — El framework más popular de Python en 2024/2025
  • Encode — Varios proyectos del mismo autor (Databases, ORM)
  • Mangum — Adapter para correr ASGI apps en AWS Lambda
  • Ariadne — GraphQL para Python basado en ASGI
  • Broadcaster — Pub/Sub para WebSockets en tiempo real

Conclusión

Starlette es uno de esos proyectos que trabaja en silencio pero sobre el que descansan miles de APIs en producción. Su diseño minimalista, su conformidad con el estándar ASGI y su alto rendimiento lo convierten en la elección natural como base para frameworks de mayor nivel como FastAPI. Si desarrollas con FastAPI, ya estás usando Starlette; si algún día necesitas más control o quieres construir algo desde cero sobre bases sólidas, Starlette es la respuesta. Vale la pena conocerlo más allá de la capa que lo oculta.