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:
- Uvicorn como servidor ASGI (basado en
uvloopyhttptools) - Uso nativo de
asynciosin capas de abstracción pesadas - 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.