T
traeai
登录
返回首页
Simon Willison's Weblog

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

8.7Score

TL;DR · AI 摘要

通过 Pyodide + Service Worker 在浏览器中运行 Python ASGI 应用,可将整个后端逻辑(如 FastAPI、Datasette)完全移至前端,仅需静态文件服务器;实测支持 Datasette 1.0a31,解决了此前 Web Worker 方案中 `<script>>` 标签无法执行的问题。

核心要点

  • 使用 Pyodide + Service Worker 实现 ASGI 协议在浏览器内端到端执行,拦截 `/app/` 下所有同源请求并转发至 Python 应
  • 已成功部署 Datasette 1.0a31 的完整版浏览器运行实例(https://simonw.github.io/research/pyodide-asg
  • 相较早期 Datasette Lite 的 Web Worker 方案,新方案支持 `<script>>` 标签执行,修复了插件兼容性问题。

结构提纲

按章节快速跳转。

  1. 介绍 Datasette Lite 历史版本因 Web Worker 限制导致 JS 脚本不执行的问题,引出新方案需求。

  2. 利用 Pyodide 将 Python 运行时嵌入浏览器,结合 Service Worker 拦截 /app/ 请求并按 ASGI 协议转发给 Python 应用。

  3. Service Worker 截获 fetch 请求 → 解析 ASGI scope 和 body → 调用 Pyodide 中的 ASGI 应用 → 返回响应,全程无后端服务依赖(除静态资源)。

  4. 提供 FastAPI 快速示例及 Datasette 1.0a31 完整运行 demo,证明该方法对任意 ASGI 应用具有通用性。

  5. 作者仍在理解机制细节,后续将升级 Datasette Lite 主体项目,进一步优化性能与兼容性。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Browser-based Python ASGI Apps with Pyodide & Service Worker
    • 核心目标
      • 零后端服务(仅需静态文件)
      • 支持任意 ASGI 应用
    • 关键技术栈
      • Pyodide (Python in WASM)
      • Service Worker (请求拦截)
      • ASGI Protocol (Python ↔ Browser)
    • 落地案例
      • FastAPI Demo
      • Datasette 1.0a31 Full Run

金句 / Highlights

值得收藏与分享的关键句。

  • 该项目拦截所有同源请求 `/app/` 并通过 ASGI 协议在 Python 应用中执行,仅需静态文件服务器,无需后端服务。

    第 1 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 任何 `<script>>` 标签中的 JavaScript 都不会被执行——破坏部分 Datasette 功能及大量插件。

    第 3 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 我仍在理解其具体工作机制,但一旦掌握,就计划升级 Datasette Lite 本身。

    第 6 段

    ⬇︎ 下载 PNG𝕏 分享到 X
#Pyodide#ASGI#Service Worker#Datasette#WebAssembly
打开原文

研究:通过 Pyodide + 服务工作线程在浏览器中运行 Python ASGI 应用 原文链接

Running Python ASGI apps in the browser via Pyodide + a service worker —— 本项目通过 Pyodide 和专用服务工作线程,在浏览器中完全运行 Python ASGI 网络应用,拦截所有以 /app/ 开头的同源请求,并通过 ASGI 协议将这些请求转发至 Python 应用执行,从而仅需处理静态文件时才依赖后端服务器。该机制已通过 FastAPI 示例和完整的 Datasette 应用进行了演示,验证了其对各类 ASGI 应用的通用性。

Datasette Lite 是我基于 Pyodide WebAssembly 在浏览器中完整运行的 Datasette 版本。

四年前我首次构建它时 2022 年 5 月 4 日,采用的是 Web Workers 技术,并通过拦截导航操作、运行 Python 应用生成 HTML 的方式来实现。 虽然该方案可行,但存在一个明显缺陷:所有 <script> 标签中的 JavaScript 均不会被运行,导致部分 Datasette 功能及大量 Datasette 插件失效。

今天上午,我在 Claude Code for web 中向 Claude Opus 4.8 提出了任务 112,要求其探索如何使用服务工作线程在 Pyodide 中运行 Python ASGI 应用;结果表明该方案确实有效! 这里是一个 基础 ASGI FastCGI 演示,以及一个 运行 Datasette 1.0a31 的演示

目前我仍在深入理解其具体原理,待理清之后,计划将此技术应用于升级 Datasette Lite 本身。

AI 可能会生成不准确的信息,请核实重要内容