Rust 2026-06-29·Ievgenii Svyryd

Rustango CMS:一款用 Rust 打造的 Wagtail 风格 CMS

一套构建于 Rustango 之上的内容管理系统,将 Wagtail 的页面树、StreamField、snippets 和图片衍生图移植到 Rust——多租户、类型安全且高性能。

Rustango CMS:一款用 Rust 打造的 Wagtail 风格 CMS

Rustango 让我在 Rust 中拥有了 Django。随之而来的自然是那个 Django 开发者在模型就位后总会问的问题:Wagtail 在哪里?Wagtail 是那个把 Django 项目变成营销团队真正能运营起来的内容管理系统——一棵页面树、丰富的结构化内容、一个媒体库,以及一个让非开发者也爱不释手的编辑器界面。

Rustango CMS 就是 Rustango 的这一层:一个 Wagtail 风格的 CMS,将页面树、StreamField、snippet 和图片渲染版本移植到 Rust——从头到尾都是多租户且类型安全的。

以类型化模型表达页面

每种页面类型都是一个同时派生 ModelPageType 的 Rust struct。该 struct 的字段会通过字段控件成为管理后台中可编辑的表单;页面存在于一棵树(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。

代码片段、媒体库和真实的图片渲染版本

那些不是页面的可复用内容——作者、分类、站点的品牌形象——以片段(snippet)的形式存放在一个资料库里,带有文件夹、搜索、版本历史和翻译。图片会经过一个媒体库,按需生成渲染件(rendition):请求一个尺寸和格式,CMS 就会调整大小、按焦点裁剪、重新编码为 WebP 或 AVIF,并缓存结果。

{# 直接从模板输出响应式、经格式协商的图片 #}
{{ rcms_picture(media_id=hero, filters=["fill-1200x630"],
                formats=["avif", "webp"], alt=page.title) | safe }}

SEO、i18n 和多租户均为标准配置

每个页面都携带 SEO 和 Open Graph 字段,一个模板辅助函数即可输出 canonical、description、OG 和 Twitter 卡片标签;站点地图会自动提供。管理后台已完全本地化,内容可按语言区域翻译,而且——因为它构建于 Rustango 之上——单次部署即可服务众多租户,每个租户都拥有自己的数据库、页面、主题和媒体。

CMS 是对那些非工程师人群的一个承诺:他们无需提交工单就能修改网站。Rustango CMS 用一门通常会忘记这些人存在的语言,兑现了这个承诺。

它的走向

Rustango CMS 已经在运行这个博客——页面树、StreamField 正文、生成的封面图、SEO 标签以及各语言版本的内容都出自它之手。它证明了 Rust 并不意味着要放弃让 Django 和 Wagtail 如此高效的那种编辑体验。你可以同时拥有这份人体工学这些保证。

联系我 →