大家好,我是何三,独立开发者
如果你是一个 Python 开发者,大概率经历过这种绝望——
后端写得好好的,老板说"你顺便把前端也做了吧"。然后你就开始学 HTML、CSS、JavaScript、React、Vue、Webpack、Vite、Tailwind……学着学着发现,这他妈是个无底洞。
现在有人告诉你:不用。一行 JS 都不用写。纯 Python,就能撸出一个 React 级别的现代 Web 应用。
这个项目叫 Rio。
听名字你可能以为是那个巴西城市,但它跟里约热内卢唯一的共同点是——都很热。GitHub 上已经有好几千 Star,而且增速相当猛。
这玩意儿到底怎么做到的?
Rio 的思路其实特别"暴力"——
它把 React 那套组件化思维,完全用 Python 重新实现了一遍。

你在 Rio 里写的代码长这样:
import rio
class MyApp(rio.Component):
def build(self) -> rio.Component:
return rio.Column(
rio.Text("Hello, Rio!", style="heading1"),
rio.Button("点我", on_press=self.on_click),
rio.Switch(is_on=True),
)
def on_click(self):
print("被点了!")
看到没?没有 <div>,没有 className,没有 useState,没有 JSX,没有 CSS-in-JS。就是纯纯的 Python 类和方法。
说白了,以前你得在 Python 后端和 JS 前端之间来回切换、传 JSON、调 API、对接口文档,现在全在一个 .py 文件里搞定。 组件、状态、事件处理、路由——全是 Python。
这还没完。Rio 内置了一套完整的服务端渲染 + WebSocket 推送机制。你在 Python 里改了组件的状态,前端自动更新,不用手动调 setState,不用管虚拟 DOM diff,什么都不用管。
这让我想起一个事。前阵子有个朋友接了个外包项目,甲方要一个内部库存管理系统,CRUD 为主,但界面得"好看、专业"。他硬着头皮学了三个月 React,最后交付的东西甲方说"还行吧,就是加载有点慢"。我说你当时要是知道 Rio,可能两天就搞完了。
他沉默了。
然后把我拉黑了。
它跟 Streamlit 有什么不一样?
很多人第一反应是:"这不就是 Streamlit 吗?"
一开始我也这么想。Streamlit 也是纯 Python 写 Web 应用,对吧?
但实际用下来,区别是真的大。
Streamlit 的设计哲学是"脚本式"——你写一个 Python 脚本,从上到下执行,每次用户点个按钮、选个下拉框,整个脚本重新跑一遍。这意味着什么?意味着你的状态、缓存、数据库连接全得小心翼翼地管理。稍微复杂点的应用,代码就开始像意大利面条一样缠在一起。
Rio 不一样。它是组件式的,跟 React 一个思路。每个组件有自己的生命周期和状态,组件之间可以嵌套、传参、通信、复用。你写的是一个真正的"应用",不是"一个会反复重新运行的脚本"。

用人话讲:Streamlit 适合做数据看板和 demo,Rio 适合做真正的 Web 应用。
说实话,Rio 内部是怎么处理 WebSocket 连接池和增量 DOM 更新的,这块我也没完全搞懂。但反正用起来确实比 Streamlit 丝滑很多,尤其是页面状态复杂、一堆交互控件的时候,Streamlit 那种"全量重跑"的问题在 Rio 这儿根本不存在。
实际跑一下
安装简单到令人发指:
pip install rio-ui
然后创建一个新项目:
rio new my-app
cd my-app
rio run
浏览器自动打开 http://localhost:8000,一个完整的 Web 应用就跑起来了。
改代码保存后,页面自动热更新,不用手动刷新。这个体验跟 Vite 的 HMR 差不多,但它背后是纯 Python,想想就离谱。
内置的组件也很全:
- 按钮、输入框、文本域、下拉菜单
- 表格(带排序、分页)
- 对话框、抽屉、弹出菜单
- 图表(基于 Plotly)
- 文件上传、进度条
- Markdown 渲染器
- 甚至还内置了深色/浅色主题切换
基本上 CRUD 应用需要的全有了。而且你可以一键切换主题配色:
app = rio.App(theme=rio.Theme.from_colors(
primary=rio.Color.from_hex("#6C63FF"),
secondary=rio.Color.from_hex("#FF6584"),
))
这个自定义主题的灵活度——算了先不说这个,你先装上看效果。真的,五分钟的事。
谁适合用 Rio?
不是所有人都需要用 Rio。
如果你已经是一个熟练的 React/Vue 开发者,团队里前端后端分工明确,切换过来意义不大。别折腾。
但如果你是:
- Python 后端,偶尔需要写前端界面(这个群体巨大)
- 独立开发者,想快速做一个 MVP 验证想法
- 内部工具 / 后台管理系统开发者
- 对前端一窍不通但需要 Web UI 的数据工程师
那 Rio 简直是为你量身定做的。
为什么这么设计?别问我,问作者去。但我觉得他们就是想通了——世界上用 Python 的人比用 JavaScript 的人多,但能做 Web UI 的工具却少得可怜。这个需求缺口,大得能塞进一个巴西。
Rio 不是唯一一个"用 Python 替代前端"的框架。同赛道的还有几个值得关注:
Reflex(原 Pynecone):思路跟 Rio 最接近,也是组件化 + 纯 Python。但底层编译到 Next.js,架构更重,打包出来一堆 node_modules。适合已经熟悉 React 生态的人。
NiceGUI:更轻量,基于 Vue/Quasar,写简单 UI 很爽。但复杂应用的组件抽象和状态管理不如 Rio 完善。
FastUI:FastAPI 作者 Sebastián Ramírez 搞的,理念很好但目前还在早期阶段,组件库不够丰富,观望中。
Streamlit:刚才说过,脚本式执行模型决定了它不适合复杂应用。但数据科学场景下依然是首选。
GitHub 地址
👉 https://github.com/rio-labs/rio
⭐ 顺手点个 Star,反正不花钱,还能救一个被前端折磨的 Python 开发者。
Rio 不是什么银弹。但如果你是一个不想碰 JavaScript 的 Python 开发者,它能让你在一下午之内,从零撸出一个像模像样的 Web 应用。就这一点,它值得你花五分钟试试。
本文使用 MGO 编辑并发布
关注"何三笔记",回复"mgo" 免费下载使用