通过 Pyodide 和 Service Worker 在浏览器中运行 Python ASGI 应用程序
摘要
该项目展示了如何利用 Pyodide 和 Service Worker 在浏览器中完全运行 Python ASGI Web 应用程序,拦截指定路径下的请求并通过 ASGI 协议执行。示例包括 FastAPI 和完整的 Datasette 应用。
暂无内容
查看缓存全文
缓存时间: 2026/05/30 23:11
# 研究:通过 Pyodide + Service Worker 在浏览器中运行 Python ASGI 应用
来源:https://simonwillison.net/2026/May/30/pyodide-asgi-browser/
研究 (https://simonwillison.net/elsewhere/research/)
通过 Pyodide + Service Worker 在浏览器中运行 Python ASGI 应用 (https://github.com/simonw/research/tree/main/pyodide-asgi-browser#readme)
——该项目通过在浏览器中完全使用 Pyodide 和一个专用的 Service Worker 运行 Python ASGI Web 应用程序,拦截所有对 `/app/` 路径的同源请求,并通过 ASGI 协议在 Python 应用中执行它们——从而无需后端服务器(静态文件除外)。该机制已通过 FastAPI 演示应用和完整的 Datasette 应用得到了验证,证实其对各类 ASGI 应用具有通用性。
Datasette Lite (https://lite.datasette.io/) 是我制作的 Datasette 版本,它完全在浏览器中运行,通过 Pyodide 使用 WebAssembly。四年前 (https://simonwillison.net/2022/May/4/datasette-lite/) 我首次构建它时,使用了 Web Workers 以及拦截导航操作、通过运行 Python 应用获取生成 HTML 的代码。这种方法能工作,但缺点是 `<script>` 标签中的任何 JavaScript 都不会被执行——这破坏了一些 Datasette 功能以及大量 Datasette 插件。
今天早上,我给 Claude Opus 4.8 布置了一个任务 (https://github.com/simonw/research/pull/112)(在 Claude Code for web 中),研究如何改用 Service Workers 在 Pyodide 中运行 Python ASGI 应用,它似乎成功了!这里有一个基础的 ASGI FastCGI 演示 (https://simonw.github.io/research/pyodide-asgi-browser/) 以及一个运行 Datasette 1.0a31 的演示 (https://simonw.github.io/research/pyodide-asgi-browser/datasette.html)。我还在琢磨其具体工作原理,但一旦搞明白,我就计划升级 Datasette Lite 本身。
相似文章
使用MicroPython和WASM在沙盒中运行Python代码
Simon Willison介绍了micropython-wasm,一个alpha版本包,它使用编译为WebAssembly的MicroPython在沙盒中运行Python代码,从而在Datasette等Python应用中实现安全的插件执行。
OPFS + Pyodide 测试工具
一个用于在浏览器中使用Pyodide实验源私有文件系统(OPFS)的测试工具,旨在探索Datasette Lite的持久化SQLite存储。
向PyPI发布WASM wheels以用于Pyodide
PyPI现在支持为Pyodide发布WebAssembly wheels,允许包维护者直接分发他们自己的WASM包。本文以luau-wasm包为例进行演示。
Edge Python:一个170KB的沙盒化Python子集(WASM),用于在客户端(直接在浏览器中)运行代理生成的代码
Edge Python 是一个基于 WASM 的 170 KB 沙盒化 Python 子集,无需服务器即可直接在浏览器中运行代理生成的代码,支持类、async/await、模式匹配等特性。
Datasette Apps: 在 Datasette 中托管自定义HTML应用程序
Datasette Apps 是一个新插件,允许用户在 Datasette 内托管自定义、沙盒化的 HTML+JavaScript 应用程序,通过 iframe 实现安全的只读和写入 SQL 查询。