Rustango CMS: CMS у стилі Wagtail на Rust
Система керування контентом, побудована на Rustango, що переносить дерево сторінок Wagtail, StreamField, сніпети та рендиції зображень у Rust — мультитенантна, типобезпечна та швидка.
Rustango дав мені Django на Rust. Природним наступним питанням було те, яке розробники Django завжди ставлять, щойно моделі готові: де Wagtail? Wagtail - це система управління контентом, яка перетворює проєкт Django на щось, чим маркетингова команда справді може керувати: дерево сторінок, багатий структурований контент, медіабібліотека та інтерфейс редактора, який обожнюють нерозробники.
Rustango CMS - це саме той шар для Rustango: CMS у стилі Wagtail, яка переносить дерево сторінок, StreamField, сніпети та рендери зображень на Rust - мультитенантна й типобезпечна від початку до кінця.
Сторінки як типізовані моделі
Кожен тип сторінки - це Rust-структура, яка похідна одночасно від Model і PageType. Поля структури стають редагованою формою в адмінці через віджети полів; сторінка живе в дереві (cms_page), тоді як її типізовані дані живуть у таблиці розширень. Ви оголошуєте дозволених батьків і нащадків, шаблон та іконку - а CMS з'єднує маршрутизацію, хлібні крихти та редактор.
#[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: структурований контент, а не каша з HTML
Рушій блоків - найкраща ідея Wagtail: замість одного великого поля форматованого тексту контент є впорядкованим потоком типізованих блоків - заголовок, абзац, зображення, приклад коду, цитата або власний блок, який ви реєструєте самостійно. Редактори компонують сторінки з будівельних блоків; шаблони відображають кожен блок з його власним частковим шаблоном. Допис, який ви читаєте, - це StreamField.
Сніпети, медіабібліотека та справжні рендиції зображень
Багаторазовий контент, який не є сторінкою - автори, категорії, брендинг сайту - живе як сніпети в Бібліотеці, з теками, пошуком, ревізіями та перекладами. Зображення проходять через медіабібліотеку з рендиціями на вимогу: запитуєте розмір і формат - і CMS змінює розмір, обрізає за фокусною точкою і перекодовує у WebP чи AVIF, кешуючи результат.
{# Адаптивні зображення з узгодженням формату прямо з шаблону #}
{{ rcms_picture(media_id=hero, filters=["fill-1200x630"],
formats=["avif", "webp"], alt=page.title) | safe }}
SEO, i18n та мультиорендність доступні з коробки
Кожна сторінка несе поля SEO та Open Graph, а один шаблонний помічник видає канонічні теги, опис, OG та теги Twitter-card; sitemap віддається автоматично. Адмінка повністю локалізована, контент можна перекладати для кожної локалі, і - оскільки все побудовано на Rustango - одне розгортання обслуговує багато тенантів, кожен зі своєю базою даних, сторінками, темою та медіа.
CMS — це обіцянка людям, які не є інженерами: що вони можуть змінити сайт, не подаючи заявку. Rustango CMS дотримується цієї обіцянки мовою, яка зазвичай забуває, що такі люди існують.
Куди це рухається
Rustango CMS уже запускає цей блог - дерево сторінок, тіла StreamField, згенеровані обкладинки, SEO-теги і контент для кожної локалі - усе це походить звідти. Це доказ того, що Rust не обов'язково означає відмову від досвіду редагування, який зробив Django і Wagtail такими продуктивними. Ви можете мати і ергономіку, і гарантії.