🎯 Проекты 1 мин чтения

Python ASGI-приложения в браузере через Pyodide + Service Worker вместо Web Worker

Простым языком

Datasette Lite запускает Python прямо в браузере через WebAssembly. Раньше для этого использовался Web Worker — фоновый поток, который перехватывал навигацию и подставлял HTML от Python-кода. Но JavaScript внутри этого HTML не работал, потому что Web Worker живёт в изолированном контексте. Новый подход через Service Worker обходит это ограничение: браузер воспринимает ответы как обычные HTTP-ответы от того же сайта и исполняет JS-код в них.

Что нового

  • Замена Web Worker на Service Worker для перехвата fetch-запросов — браузер корректно исполняет <script>-теги в ответах
  • ASGI-приложение выполняется в Pyodide (WebAssembly), Service Worker подменяет навигационные запросы результатами
  • Решение сгенерировано Claude Opus 4.8 в Claude Code — демонстрация генерации рабочего инфраструктурного кода LLM
  • Работает с Datasette 1.0a31 — реальный production-ready фреймворк, а не hello-world

Вердикт

Паттерн применим, если нужно запускать Python ASGI-приложения в браузере с полной поддержкой клиентского JS. Ограничение: Simon Willison сам отмечает, что ещё разбирается в деталях работы — это early-stage research, не готовый фреймворк. Для production нужна собственная валидация security-модели Service Worker в вашем контексте.

Service Worker вместо Web Worker для Pyodide-приложений решает проблему неисполнения <script>-тегов в сгенерированном HTML — браузер видит ответ как обычный fetch от origin и исполняет JS корректно.