Rustango CMS: un CMS al estilo de Wagtail en Rust
Un sistema de gestión de contenidos construido sobre Rustango que traslada el árbol de páginas, StreamField, snippets y renditions de imágenes de Wagtail a Rust: multiinquilino, con seguridad de tipos y rápido.
Rustango me dio Django en Rust. La siguiente pregunta natural era la que los desarrolladores de Django siempre hacen una vez que los modelos están en su lugar: ¿dónde está Wagtail? Wagtail es el sistema de gestión de contenidos que convierte un proyecto Django en algo que un equipo de marketing puede administrar de verdad: un árbol de páginas, contenido estructurado enriquecido, una biblioteca multimedia y una interfaz de edición que a los no desarrolladores les encanta.
Rustango CMS es esa capa para Rustango: un CMS al estilo de Wagtail que porta el árbol de páginas, StreamField, los snippets y las representaciones de imágenes a Rust: multiinquilino y con seguridad de tipos de arriba abajo.
Páginas como modelos tipados
Cada tipo de página es una struct de Rust que deriva tanto Model como PageType. Los campos de la struct se convierten en el formulario editable del panel de administración mediante widgets de campo; la página vive en un árbol (cms_page) mientras que sus datos tipados viven en una tabla de extensión. Declaras los padres e hijos permitidos, la plantilla y un icono, y el CMS conecta el enrutamiento, las migas de pan y el editor.
#[derive(Model, PageType, Default, Serialize, Deserialize)]
#[rustango(table = "blog_post_ext", app = "blog")]
#[page_type(
type_name = "BlogPost", template = "blog_post.html", icon = "article",
allowed_parents(BlogIndex),
)]
pub struct BlogPost {
#[rustango(primary_key)]
pub id: Auto<i64>,
#[rustango(fk = "cms_page", on = "id", unique)]
pub page_id: i64,
#[field(widget = RichText, label = "Intro")]
pub intro: String,
#[field(widget = Stream, allowed(heading, paragraph, image, code, quote))]
pub body: Option<String>,
}
StreamField: contenido estructurado, no una sopa de HTML
El motor de bloques es la mejor idea de Wagtail: en lugar de un único campo grande de texto enriquecido, el contenido es un flujo ordenado de bloques tipados: un encabezado, un párrafo, una imagen, un ejemplo de código, una cita o un bloque personalizado que registras tú mismo. Los editores componen las páginas a partir de bloques de construcción; las plantillas renderizan cada bloque con su propia parcial. La entrada que estás leyendo es un StreamField.
Snippets, una biblioteca multimedia y renditions de imagen reales
El contenido reutilizable que no es una página —autores, categorías, la identidad de marca de un sitio— vive como snippets en una Biblioteca, con carpetas, búsqueda, revisiones y traducciones. Las imágenes pasan por una biblioteca de medios con renders bajo demanda: pides un tamaño y un formato y el CMS redimensiona, recorta según un punto focal y vuelve a codificar a WebP o AVIF, almacenando el resultado en caché.
{# Imágenes responsivas con negociación de formato directamente desde una plantilla #}
{{ rcms_picture(media_id=hero, filters=["fill-1200x630"],
formats=["avif", "webp"], alt=page.title) | safe }}
El SEO, la i18n y la multitenencia vienen de serie
Cada página lleva campos de SEO y Open Graph, y un único helper de plantilla emite etiquetas canónicas, de descripción, OG y de tarjeta de Twitter; un sitemap se sirve automáticamente. El admin está completamente localizado, el contenido puede traducirse por idioma y - al estar construido sobre Rustango - un único despliegue sirve a muchos inquilinos, cada uno con su propia base de datos, páginas, tema y medios.
Un CMS es una promesa a las personas que no son ingenieras: que pueden cambiar el sitio sin abrir un ticket. Rustango CMS mantiene esa promesa en un lenguaje que normalmente olvida que esas personas existen.
Hacia dónde va
Rustango CMS ya ejecuta este blog: el árbol de páginas, los cuerpos StreamField, las imágenes de portada generadas, las etiquetas SEO y el contenido por idioma provienen todos de él. Es la prueba de que Rust no tiene por qué significar renunciar a la experiencia de edición que hizo a Django y a Wagtail tan productivos. Puedes tener la ergonomía y las garantías.