Simon Willison 在其博客中介绍了一项新的研究项目:通过 Pyodide 与 Service Worker 在浏览器中运行 Python ASGI 应用。这一思路的核心在于,利用一个专门的服务工作线程拦截 /app/ 路径下所有同源请求,并将这些请求按照 ASGI 协议交由运行在 WebAssembly 中的 Python 应用处理。这样一来,除了托管静态文件之外,就不再需要任何后端服务器。该机制已通过一个 FastAPI 演示和一个完整运行的 Datasette 应用得到验证,说明它对各类 ASGI 应用具有普遍适用性。
要理解这项研究的价值,需要回顾 Datasette Lite 的历史。Datasette Lite 是 Willison 打造的 Datasette 浏览器版本,完全依靠 Pyodide 在 WebAssembly 中运行,无需服务器即可查询数据。大约四年前首次构建它时,他采用的是 Web Worker 方案,并编写代码拦截导航操作,通过运行 Python 应用来获取生成的 HTML。
这种旧方案虽然可行,但存在一个明显缺陷:HTML 中 <script> 标签内的 JavaScript 不会被执行。这直接破坏了 Datasette 的部分功能,也使大量 Datasette 插件无法正常工作。对于高度依赖插件生态的 Datasette 来说,这是一个不小的限制。
为了突破这一瓶颈,Willison 于 5 月 30 日当天在 Claude Code 的网页版中,把研究如何使用 Service Worker 替代原有方案、在 Pyodide 中运行 Python ASGI 应用的任务交给了 Claude Opus 4.8。从结果来看,这一尝试取得了成功。项目提供了两个可访问的演示:一个是基础的 ASGI FastCGI 演示,另一个则运行完整的 Datasette 1.0a31。
Willison 坦言,自己目前仍在消化这套方案的具体工作原理,尚未完全掌握所有细节。但他已经明确了下一步计划:一旦完全理解其运作方式,就会用这项技术升级 Datasette Lite 本身,从而让浏览器版 Datasette 支持那些此前因脚本无法执行而失效的功能与插件。
从更广的角度看,这项工作展示了浏览器端运行完整 Python Web 应用的可能性。借助 Pyodide 提供的 WebAssembly 运行时,再配合 Service Worker 对请求的拦截能力,开发者无需搭建后端即可部署 ASGI 应用,同时还能让页面内的 JavaScript 正常执行。这一组合为纯前端托管动态 Web 应用开辟了新的路径,也让人对 Datasette Lite 未来的升级充满期待。