Pelican、Nikola、Lektor、MkDocs:Python 的静态站点生成器生态
Wagtail 和 django CMS 都是完整的 Django 应用,跑起来得配 Python 运行时和 PostgreSQL 数据库。如果只是搭一个个人技术博客、项目文档站,或者几页不常改的产品介绍,不想为几篇 Markdown 文章长年维护一套数据库和后端进程,Python 生态里还有另一条路:静态站点生成器(SSG)。
先把名分定清楚:静态站点生成器不建后台、不存内容,只在构建时把本地的 Markdown 或 reStructuredText 文件渲染成 HTML 页面——它们是发布工具,不是 CMS。多人协作审批、在线改稿、会员权限这些事,纯静态方案接不住。
即便算上静态站点生成器,Python 在个人建站圈的声量也远不如 JavaScript 生态的 Hexo、Astro、Next.js,或者 Go 生态的 Hugo。原因很实在:
- 构建速度拼不过编译型语言:Hugo 用 Go 写,几千篇文章的构建在毫秒到秒级;Python 的 Pelican、Nikola 跑同样规模要慢一个量级,不过百来篇规模的个人博客体感差别不大;
- 前端生态天然在 JavaScript 那边:现代静态站越来越吃前端组件(React、Vue、Tailwind CSS),直接用 Astro 或 Next.js 做静态输出更顺手,专门切到 Python 跑构建的人自然就少了;
- Python 开发者有自己顺手的场景:写文章、做数据分析、维护开源库文档都在 Python 环境里,全套工具链留在同一个
venv、用熟悉的 Jinja2 模板改页面,不用为了发个站再装一套 Node.js 的node_modules。
Python 的静态生成工具活得相当稳,各自卡住了明确的生态位。下面看四款代表工具。
Pelican:Python 静态博客的老牌主力(AGPL-3.0,最新正式版 4.11.0/2025-01)
Pelican 2010 年由法国开发者 Alexis Métaireau 发起,名字是法语单词 calepin(笔记本)的字母重排,目前由 Justin Mayer 等维护。它是 Python 生态里资历最深、插件积累最厚的静态博客生成器。
- 输入格式:原生支持 reStructuredText 和 Markdown,装上插件也能读 AsciiDoc;
- 模板与输出:用 Python 开发者最熟的 Jinja2 写模板;内置 Atom 与 RSS Feed 生成、代码语法高亮(基于 Pygments)、多语言文章关联,还带从 WordPress、Dotclear 或 RSS Feed 导入旧文章的命令行工具;
- 插件机制:Pelican 4.5 引入命名空间插件(Namespace Plugins)后,原来集中存放的单体仓库
getpelican/pelican-plugins已归档只读,现迁移到pelican-pluginsGitHub 组织下拆成 70 多个独立仓库,直接用pip install pelican-xxx按需安装; - 协议留意一笔:Pelican 的仓库
LICENSE原文是 AGPL-3.0(不是 BSD 或 MIT)。不过它只是本地或 CI 里的命令行构建工具,生成出来的 HTML、CSS 静态文件不受 AGPL 传染;只要你不修改 Pelican 源码并把它包装成在线建站服务对外提供,日常拿它生成博客或商业站点没有开源传染风险。
谁适合用:日常主力语言是 Python、想用 Markdown 或 reStructuredText 写技术博客、喜欢用 Jinja2 自己改主题的个人开发者。
Nikola:开箱原生支持 Jupyter Notebook(MIT,最新正式版 8.3.3/2025-05)
Nikola 2012 年由 Roberto Alsina 发起,定位跟 Pelican 接近,但有一项核心差异:开箱原生支持 .ipynb(Jupyter Notebook)格式,不需要额外装插件。
把 .ipynb 文件直接丢进文章目录,Nikola 构建时会把里面的代码单元格、运行输出、图表和 Markdown 说明文字直接渲染成静态网页。Pelican 和 MkDocs 也能通过第三方插件(如 pelican-jupyter、mkdocs-jupyter)支持 Notebook,但插件跟主程序的版本兼容得自己盯,不如 Nikola 内置省心。
除此之外,Nikola 的模板引擎同时支持 Mako 和 Jinja2,内置多语言站点构建(官网标明支持超过 40 种界面语言)、图片相册生成,并用 doit 做增量构建——改一篇文章只重新渲染受影响的页面,不用全站重跑。
谁适合用:数据科学、机器学习方向的从业者。日常笔记和实验本来就写在 Jupyter Notebook 里,用 Nikola 可以直接把 .ipynb 当博客文章发出去,省掉导出再排版的步骤。
Lektor:带本地管理界面的中间态(BSD-3-Clause,最新正式版 3.3.12/2024-08)
Lektor 2015 年由 Flask 与 Jinja2 的作者 Armin Ronacher 发起。官方给自己的定位既不是纯静态生成器,也不是传统服务端 CMS,而是介于两者之间的文件型静态内容管理系统(File-based CMS)。
它补上了纯静态工具最缺的那块短板:自带一个基于 Flask 和 React 的本地 Web 管理界面。在本地跑起 lektor server,浏览器打开就能在图形界面里新建页面、填表单字段、传图片;保存之后,数据不进数据库,而是按目录树写成纯文本的 contents.lr 文件,还能在 .ini 模型文件里自定义每个页面的字段结构。写完点击构建,产出的依然是一包纯静态 HTML,直接推到 GitHub Pages 或 Cloudflare Pages 就能上线。
代价看版本日期就能算出来:最新正式版 3.3.12 发布于 2024 年 8 月,此后两年多没有发新正式版(代码仓库在 2026 年 10 月仍有维护提交),主题和插件生态比 Pelican 小得多。
谁适合用:想要静态站的零服务器部署成本,又不想天天对着纯文本 Front Matter 手敲字段、希望在本地有个图形后台管内容结构的个人或小团队。
MkDocs:技术文档站的事实标准(BSD-2-Clause,最新正式版 1.6.1/2024-08)
MkDocs 从一开始就不做博客,专攻项目技术文档。一个 mkdocs.yml 配置文件加上一目录 Markdown,几分钟就能跑起一套结构清晰的文档站。
MkDocs 本体最新正式版 1.6.1 停在 2024 年 8 月,但撑起它半壁江山的主题项目 Material for MkDocs(mkdocs-material,MIT,最新正式版 9.7.6/2026-03)一直保持高频更新。配齐这套组合后,纯静态输出就能拿到:
- 纯前端离线全文搜索:构建时生成搜索索引,不依赖后端服务就能搜全文;
- 文档专属交互:深色模式切换、代码块一键复制与行号高亮、选项卡、提示框(Admonitions)、API 参数表;
- 多版本文档切换:配合官方
mike工具,可以按版本号(如v1.0、v2.0)并排托管多套历史文档。
在技术文档这个细分场景里,MkDocs + Material 已经走出了 Python 圈——大量非 Python 项目的开源文档也直接拿它搭。至于 Python 生态里另一款老牌文档工具 Sphinx(BSD-2-Clause,最新正式版 9.1.0/2026-03),默认走 reStructuredText 语法、擅长从 Python 源码 docstring 自动抽 API 参考手册;如果写的是面向用户的产品手册或通用技术文档,MkDocs 的 Markdown 工作流要轻快得多。
另一条中间路:Wagtail 后台 + 静态导出
如果团队里有不懂技术的运营人员,必须有个真正的在线后台、要配审批流和细粒度权限,但上线端又想白拿 CDN 静态托管的速度和安全性,Python 生态还有一套组合拳:Wagtail + wagtail-bakery(MIT,最新正式版 0.9.0/2024-08,仓库现归 wagtail-nest 维护)。
工作方式是把编辑和发布拆开:
- 编辑在内网跑真 CMS:Wagtail 部署在内部服务器或本地环境,编辑打开浏览器进
wagtail.admin排页面、走审批,体验跟普通动态站一模一样; - 发布靠命令烤成静态文件:内容定稿后跑一条
manage.py build,wagtail-bakery会把全站页面渲染成纯静态 HTML 导出,直接推上 S3、Cloudflare Pages 或任意 CDN;公网不暴露 Django 进程和数据库,被攻击面直接归零。
代价是你要同时维护一套内网 Django 环境和一条静态发布流水线,而且只适合纯展示型内容——只要页面上有用户登录、实时搜索或表单提交,还是得留后端接口。
该选静态工具,还是回真 CMS?
把这几条路摆在一起,分界线不在技术栈,在「谁来写内容」和「页面要不要实时交互」:
- 写作者就是开发者自己,习惯 Markdown + Git 提交流程:写技术博客用 Pelican,笔记全在 Jupyter Notebook 里用 Nikola,做项目文档直接上 MkDocs + Material;
- 只有一两个人维护、想要个本地图形界面填字段,但线上不想养服务器:用 Lektor;
- 编辑不懂 Git、多人协作要走审批流,或者站点有搜索、会员、动态筛选:静态工具补不齐这笔账,老老实实回 Wagtail 或 django CMS。
至于「项目里要卖货、管订单和库存」——那既不是静态工具的事,也不是内容管理系统该硬扛的活。Python 生态里专门干电商的是另一套引擎。
- 点赞
- 收藏
- 关注作者
评论(0)