Vale la pena echarle un vistazo a Litestar
(b-list.org)- Litestar es una joya poco conocida entre los frameworks web asíncronos de Python
- Gracias a su rápida escalabilidad y arquitectura flexible, se puede aplicar fácilmente a distintos tipos de proyectos
- Ofrece modelado de datos sin depender de bibliotecas específicas como Pydantic
- Su integración con SQLAlchemy es excelente, lo que le da una gran fortaleza en conexión y gestión de bases de datos
- Sus funciones integradas para autenticación, caché, logging, monitoreo y más permiten usarlo de inmediato en entornos reales
Resumen de Litestar
- En los últimos años han ganado atención los frameworks web de Python async-first y basados en type hints, y entre ellos se eligió Litestar para adquirir experiencia de uso
- Al adoptarlo como framework principal en varios proyectos reales, la confianza en esa elección ha seguido aumentando
- Muchos desarrolladores web de Python aún no conocen Litestar, así que este texto presenta sus principales ventajas y características distintivas
Ejemplos y comparación con otros frameworks
-
Litestar permite escribir con mucha facilidad incluso una aplicación web de un solo archivo
- El route decorator es una función independiente que no está ligada al objeto app
- En el código de ejemplo, al acceder a
/greet?name=Bobse devuelve “Hi, Bob!” - Si falta un parámetro obligatorio, responde automáticamente con un 400
-
A diferencia de microframeworks clásicos de Python como Flask o FastAPI, Litestar tiene características estructurales que le permiten escalar de forma natural en proyectos de distintos tamaños
- En Flask o FastAPI, los decoradores de rutas están ligados al objeto app, lo que puede provocar problemas de import circular al separar en múltiples archivos
- Normalmente hay que usar un registro de rutas secundario (blueprint en Flask/Quart, APIRouter en FastAPI, etc.), así que la barrera de entrada sube o se requiere cambiar la estructura
- En cambio, como en Litestar el decorator es una función independiente, la transición entre una app de archivo único y una estructura distribuida a gran escala es muy sencilla
-
Gracias a la arquitectura base y la forma en que está escrita la documentación de Litestar, es posible introducir desde muy temprano los conceptos de router y agrupación de funcionalidades, lo que facilita mantener la consistencia incluso al construir APIs complejas
- Su fortaleza está en la composability, como inyección de dependencias, permisos y configuración compartida por ruta
- Es posible registrar la misma ruta varias veces para aplicar autenticación o dependencias según el entorno
Modelado sin dependencia de Pydantic
-
Frameworks como FastAPI dependen fuertemente de Pydantic para los datos
- Pydantic destaca en validación y serialización de datos basada en tipos, pero su integración directa con ORMs como SQLAlchemy no es sencilla
- En la práctica, eso obliga a escribir por separado los modelos de SQLAlchemy y los modelos de Pydantic
-
Litestar soporta de forma general distintos tipos además de Pydantic, como dataclasses, msgspec, attrs y modelos de SQLAlchemy
- Incluye un protocolo de plugins de serialización, lo que mejora su extensibilidad
- Trae extracción automática de objetos de transferencia de datos (DTO), así que si cambias la clase de datos original, el DTO se refleja automáticamente
- También permite declarar fácilmente exclusión o inclusión de campos, mapeo de nombres y DTOs para actualizaciones parciales
- Esto ayuda a evitar la duplicación de campos del modelo y errores frecuentes en procesos manuales de sincronización
Integración con SQLAlchemy y presentación de Advanced Alchemy
-
El ORM SQLAlchemy es, en la práctica, el estándar para conectarse a bases de datos en Python
- Litestar destaca mucho por su nivel de integración con SQLAlchemy, incluyendo serialización automática de esquemas, automatización de DTOs, plugins para gestión de sesiones y plugins compuestos
-
A través de la biblioteca Advanced Alchemy (mantenida por el equipo de Litestar), se amplían aún más las capacidades de SQLAlchemy
- Ofrece varias mejoras de calidad, como PKs grandes agnósticas de base de datos, timestamps automáticos, claves UUID, tipo JSON, integración con migraciones de Alembic y funciones de Seed/Export
- Una función particularmente destacable es el soporte para abstracciones de repository y service layer, que proporciona automáticamente varias capacidades de persistencia como CRUD y paginación
- En frameworks que, a diferencia de Django, ofrecen menos guía estructural, esto ayuda a establecer una forma organizativa recomendable para introducir repository/service layer
Otras características y funciones integradas
- Litestar también ofrece de forma nativa sistema de autenticación (funciones guard, middleware), caché (stores), logging, respuestas de error estandarizadas, métricas basadas en Prometheus/OpenTelemetry y soporte para htmx
- A diferencia de otros microframeworks, para implementar ciertas funciones no hace falta buscar bibliotecas externas ni escribir glue code personalizado
- Mantiene la simplicidad de un “microframework”, pero cuando se necesita expansión o funciones adicionales, estas pueden usarse de inmediato según convenga
- Más que ser un reemplazo directo de Django o Flask, su concepto se acerca a combinar de forma Pythonic ventajas de frameworks de otros lenguajes como Java Spring Boot, por ejemplo estructura inicial y conveniencia
- En conjunto, es una opción con alta productividad y ventajas estructurales para el desarrollo web profesional en Python
Conclusión
- Litestar está emergiendo como un framework que cualquier desarrollador web de Python debería considerar al menos una vez, gracias a su asincronía, enfoque basado en tipos, escalabilidad flexible, modelado de datos no rígido, y excelentes capacidades de ORM y funciones integradas
- Tras usarlo repetidamente en proyectos reales, se ha comprobado su alta productividad y mantenibilidad en entornos diversos, incluidos startups y otros tipos de proyectos
- Se espera que los desarrolladores lo incluyan entre las opciones al planear su próximo proyecto web en Python
2 comentarios
¿No existe ya una solución bastante clara para el "problema de importación circular" en Python? Me cuesta verlo como un problema grave.
Opinión de Hacker News
@post("/route", exception_handlers={...})se siente algo torpe. Ojalá en el futuro mejoren las herramientas integradas y la experiencia de desarrollo@postformque resuelva todo el manejo relacionado con formularios