ASGI at the core
Starlette routing, Uvicorn development, sync or async handlers, and clear HTTP behavior.
An independent Python framework · Issue 001
A well-marked application structure for the work ahead: routes, controllers, templates, services, and explicit plugins on a Starlette ASGI foundation.
For small beginnings
and long-lived apps.
A familiar first route
Start with server-rendered pages or an API. Add realtime, a React frontend, or a focused plugin only when your application needs it.
from pyrora import Pyrora, json, render
app = Pyrora(debug=True)
@app.get("/")
async def home(request):
return render(request, "home.html", title="Hello, Pyrora")
@app.get("/api/health")
async def health(request):
return json({"ok": True})
What’s in the box
Starlette routing, Uvicorn development, sync or async handlers, and clear HTTP behavior.
Jinja templates autoescape by default. JSON APIs and optional React/Vite starters stay first-class.
Provider-style plugins add services, routes, middleware, commands, assets, and lifecycle hooks.
WebSockets, in-memory rooms, and WebRTC signaling—without claiming to be a media server.
The loose-leaf section
Database, authentication, queues, mail, billing, admin tools, Redis broadcasting, Socket.IO, and media infrastructure belong in dedicated integrations—not every app’s dependency tree.
Open source · MIT
pip install "pyrora[server]"Python 3.10+