通过 Pyodide 和 Service Worker 在浏览器中运行 Python ASGI 应用程序

Simon Willison's Blog 工具

摘要

该项目展示了如何利用 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's Blog

Simon Willison介绍了micropython-wasm,一个alpha版本包,它使用编译为WebAssembly的MicroPython在沙盒中运行Python代码,从而在Datasette等Python应用中实现安全的插件执行。

OPFS + Pyodide 测试工具

Simon Willison's Blog

一个用于在浏览器中使用Pyodide实验源私有文件系统(OPFS)的测试工具,旨在探索Datasette Lite的持久化SQLite存储。

向PyPI发布WASM wheels以用于Pyodide

Simon Willison's Blog

PyPI现在支持为Pyodide发布WebAssembly wheels,允许包维护者直接分发他们自己的WASM包。本文以luau-wasm包为例进行演示。