ploneasgi#
ploneasgi runs Plone under an ASGI server, with no PasteDeploy .ini file, and without spending a worker thread on a client's download.
Under WSGI, a large download holds a worker thread for the duration of the client's transfer, not the duration of the work. Four slow clients take a four-thread site down. ploneasgi releases the thread when Zope returns, and streams the file from the event loop.
Server |
Concurrent slow downloads |
Page requests answered |
|---|---|---|
waitress |
4 |
0 / 12 |
uvicorn and ploneasgi |
16 |
12 / 12 |
Status: a spike, and the API will change. It requires Python 3.14 and is tested with Plone 6.2.2, on FileStorage, ZEO, RelStorage, and PGJsonb.
Warning
This documentation was written with Claude Opus 5.5, following the Plone documentation style skill, and reviewed by a human being.
Where to start#
Create a site, serve it under uvicorn, and add a native route.
Migrate from waitress, run behind a proxy, add routes, tune concurrency.
Why ASGI, how the adapter splits work from transfer, how routes stay secure.
Settings, the route directive, the access log format, and the Python API.
What it gives you#
Downloads that hold no thread. A file streams from the event loop after Zope returns, so slow clients wait on the network, not on a worker.
No zope.ini.
A short server.py and environment variables replace PasteDeploy, waitress, and runwsgi.
Native routes beside Plone. Websockets and other ASGI endpoints run in the same process, authenticated through Plone's own PAS, and guarded by a permission.
One proxy rule. Native routes understand the VirtualHostMonster rewrite your proxy already sends, so a new route needs no infrastructure change.
An access log that sees everything. Native routes and websockets included, with the time to first byte kept apart from the transfer.
What is not in scope#
Writing to the database from native routes, Windows, and any registration framework for discovering routes. Native routes explains why discovery stays explicit.