This release is a pre-release and may not be stable for production use.
EDRI
EDRI is a Python framework for building event-driven, parallel, and distributed applications. It combines messaging, task execution, and an optional API layer (REST, WebSocket, HTML) into a single coherent system.
Why EDRI?
Most Python frameworks solve one problem well:
- Celery handles background tasks but has no API layer or pub/sub.
- Kafka streams messages but does not execute tasks.
- FastAPI builds APIs but lacks task distribution.
EDRI combines all three: message routing, task execution, and API exposure in one framework.
Quick start
pip install edri[uvicorn]
# main.py
from edri import EDRI
from edri.abstract import ManagerBase, request
from edri.dataclass.event import Event
from edri.dataclass.response import Response, response
from edri.api.dataclass.api_event import api
from http import HTTPMethod
@response
class HelloResponse(Response):
message: str
@api(url="/hello/{name}", method=HTTPMethod.GET)
class Hello(Event):
name: str
response: HelloResponse
class HelloManager(ManagerBase):
@request
def greet(self, event: Hello) -> None:
event.response.message = f"Hello, {event.name}!"
if __name__ == "__main__":
edri = EDRI()
edri.add_component(HelloManager(edri.router_queue))
edri.start_api()
edri.run()
python main.py &
curl -H "Accept: application/json" http://localhost:8080/hello/World
Full getting-started guide: Getting Started
Architecture overview
Events are the universal communication primitive. The Router dispatches them by type to subscribed Managers. Managers can delegate work to Workers (threads or processes), emit new events, or use specialized components like the Scheduler (timed events) and Key-Value Store (shared state). The API layer translates external HTTP/WS requests into events. For distributed deployments, the Switch connects routers across machines via TCP/IP.
Installation
# Core
pip install edri
# With ASGI server
pip install edri[uvicorn] # recommended
pip install edri[hypercorn] # HTTP/3 support
pip install edri[daphne] # Twisted-based
# Development
pip install edri[dev]
Requirements
- Python 3.12+
- POSIX OS (Linux, macOS — macOS has never been tested)
Getting Started
If you're new to EDRI, start here:
- Getting Started — installation, minimal example, next steps
- Architecture — component model, process architecture, data flow
- Testing — unit and integration testing guide
Core Concepts
- Event — defining events, responses, field types, lifecycle
- Response — response status, directives, HTTP status mapping
- Router — dispatching, subscriptions, caching, health checks
- Manager — event handlers, workers, lifecycle, caching
- Worker — thread vs process, communication,
event_send
API Layer
- API — REST, WebSocket, HTML, content negotiation
- API Event —
@api(...)decorator, URL patterns, input extraction - Content Negotiation —
Acceptheader handling, response wrapping,Vary - Download — Path vs SharedMemoryPipe, HTTP Range
- HTML — Jinja2 templates,
{% url %}, static files - WebSocket — connection, commands, subscription protocol
- Validation —
inject(...), built-in validators, custom validators - Uploads — file upload lifecycle, temporary files, workers, cleanup responsibility
- Middleware — pipeline, auth patterns, transport-agnostic design
- Broker — client management, WebSocket subscription trie, middleware execution
Distribution
- Connector — Router ↔ Switch bridge, demands, resilience
- Switch — TCP/IP hub, message protocol, connection lifecycle
Specialized Components
- Specialized Managers — timed events, shared state
- Watcher — hot-reload for development
- JSON Encoder — custom JSON serialization
- Utility — Storage, Queue, NormalizedDefaultDict
Operations
- Environment — all configuration variables
- Deployment — production setup, Docker, Nginx, systemd, Kubernetes
- Troubleshooting — common problems, diagnostics, gotchas
- Versioned Documentation — how the
/vX.Y.Z/,/stable/and version switcher work
Examples
| Example | Area | Documentation |
|---|---|---|
| REST CRUD with validation | REST | REST CRUD |
| HTML form Post/Redirect/Get | HTML | HTML Form |
| CPU-bound WorkerProcess | Worker | CPU Bound |
| Streaming ZIP via SharedMemoryPipe | Worker | SharedMemoryPipe |
| Periodic refresh + Store | Scheduler | Periodic Refresh |
| WebSocket ticket pattern | WebSocket | WebSocket Upload |
| Bearer token authentication | Middleware | Auth Middleware |
Quick comparison with other frameworks
| Feature | EDRI | Celery | Kafka | FastAPI |
|---|---|---|---|---|
| Task execution | ✅ Built-in | ✅ Workers | ❌ Messaging only | ❌ |
| API layer | ✅ REST/WS/HTML | ❌ | ❌ | ✅ REST/WS |
| Pub/Sub | ✅ Static routing | ❌ | ✅ Dynamic | ⚠️ WS only |
| Middleware | ✅ Full pipeline | ❌ | ❌ | ✅ DI |
| Distributed | ✅ Via Switch | ✅ Brokers | ✅ Clusters | ❌ |
| Parallelism | ✅ Threads + processes | ✅ Workers | ⚠️ Consumers | ⚠️ Async |
License
MIT License.
Author
Marek Olšan (marek@olsanovi.cz)
Metadata
Release files for edri 2026.8.2rc2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| edri-2026.8.2rc2.tar.gz | 176.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| edri-2026.8.2rc2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 383.7 kB
Release files / edri-2026.8.2rc2.tar.gz
| Download URL | edri-2026.8.2rc2.tar.gz |
|---|---|
| Size | 176.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d70d80bd73268f3c581d06dfe4c736735323179a3783017f292b0b317e21431
|
|
BLAKE2b-256 checksum How to use checksums |
759e03f13b69274e712a0334b82b216213072da4098a76d7d9ade0d730595f4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / edri-2026.8.2rc2-py3-none-any.whl
| Download URL | edri-2026.8.2rc2-py3-none-any.whl |
|---|---|
| Size | 207.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f7011acb1fc18f2ac77390b902d593c64d75cc1e02904ba35d6d64ce050a54bf
|
|
BLAKE2b-256 checksum How to use checksums |
c50ab9d79e711c9c18ad81e339e0ce678da651b0addfb3cfa835d578965d52f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|