webcorn
v0.2.7
Published
ASGI/WSGI Server running in a browser
Readme
Webcorn
Webcorn is a Python ASGI/WSGI application server that runs in the browser, assisting in providing a complete offline Python web development experience.
Using Webcorn, Django/Flask/FastAPI applications can run in the browser.
Webcorn is based on Pyodide, which is a WebAssembly version of CPython that can run in the browser.
Webcorn operates in a web worker, preventing blockage of the browser's UI thread.
Webcorn relies on a service worker to redirect HTTP requests from the client. It specially handles the Set-Cookie HTTP headers generated by the python application, solving the issue of JavaScript code being unable to process Set-Cookie headers in the browser.
Through micropip, Webcorn supports installing Python packages in the browser. Before running a Python application, Webcorn checks the dependencies in the project's requirements.txt or pyproject.toml files and installs them into the browser environment.
Webcorn supports a WebAssembly version of the sqlite3 database.
Features
Webcorn has the following features:
- [x] A fully functional WSGI/ASGI application server running in the browser.
- [x] Support for Django/Flask/FastAPI/Wagtail applications.
- [x] Support for sqlite3 databases.
- [x] Support for handling Set-Cookie HTTP headers in the browser.
- [x] Support for installing Python packages from the PYPI repository.
- [ ] Support for installing JavaScript packages from the npm repository.
- [ ] Support for bundling JavaScript code
Try it
Access Webcorn Playground to see how Django/Flask/FastAPI/Wagtail applications run offline in the browser.
Run Webcorn Playground locally
Clone this repository, run python start.py in example/webcorn-playground directory, and access http://localhost:8000 in your browser.
$ git clone https://github.com/frybox/webcorn
$ cd webcorn/example/webcorn-playground
$ python start.pyUsage
Install Webcorn from npm registry:
$ npm install webcornImplement the service worker script sw.mjs:
import { startWebServer } from "webcorn/service-worker";
startWebServer();Register the service worker in the index.html file:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Webcorn Playground</title>
</head>
<body>
<script>
if ('serviceWorker' in navigator) {
const serviceWorkerScript = "sw.mjs";
const type = 'module';
navigator.serviceWorker.register(serviceWorkerScript, {type})
.then(registration => {
console.log('ServiceWorker registration successful');
})
.catch(error => {
console.error('ServiceWorker registration failed:', error);
});
} else {
console.error("ServiceWorker not support");
}
</script>
</body>
</html>Implement the webcorn server script server.mjs:
import { startAppServer } from "webcorn/server";
const options = {
projectRoot: '/opt/project_django',
appSpec: 'project_django.wsgi:application',
log: console.log,
}
try {
startAppServer(options);
} catch (e) {
window.location = new URL('../', window.location).href;
}Webcorn server html file server.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Webcorn Server - Django Application</title>
</head>
<body>
<script type="module" src="./server.mjs"></script>
</body>
</html>Check the example/webcorn-playground for more details.
License
MIT
