Skip to main content

Lightweight Python framework for writing clean and testable event-driven services

Reason this release was yanked:

no proper optional dependencies on backends

Project description

⚡ Dispytch

Dispytch is a lightweight, async-first Python framework for event-handling. It’s designed to streamline the development of clean and testable event-driven services.

🚀 Features

  • 🧠 Async-first core – built for modern Python I/O
  • 🔌 FastAPI-style dependency injection – clean, decoupled handlers
  • 🔁 Built-in retry logic – configurable, resilient, no boilerplate
  • 📬 Backend-flexible – Kafka and RabbitMQ out-of-the-box
  • 🧱 Composable architecture – extend, override, or inject anything

📦 Installation

pip install dispytch

✨ Handler example

from typing import Annotated

from pydantic import BaseModel
from dispytch import Event, Dependency, HandlerGroup

from service import UserService, get_user_service


class User(BaseModel):
    id: str
    email: str
    name: str


class UserCreatedEvent(BaseModel):
    user: User
    timestamp: int


user_events = HandlerGroup()


@user_events.handler(topic='user_events', event='user_registered')
async def handle_user_registered(
        event: Event[UserCreatedEvent],
        user_service: Annotated[UserService, Dependency(get_user_service)]
):
    user = event.body.user
    timestamp = event.body.timestamp

    print(f"[User Registered] {user.id} - {user.email} at {timestamp}")

    await user_service.do_smth_with_the_user(event.body.user)

✨ Emitter example

import uuid
from datetime import datetime

from pydantic import BaseModel
from dispytch import EventBase


class User(BaseModel):
    id: str
    email: str
    name: str


class UserEvent(EventBase):
    __topic__ = "user_events"


class UserRegistered(UserEvent):
    __event_type__ = "user_registered"

    user: User
    timestamp: int


async def example_emit(emitter):
    await emitter.emit(
        UserRegistered(
            user=User(
                id=str(uuid.uuid4()),
                email="example@mail.com",
                name="John Doe",
            ),
            timestamp=int(datetime.now().timestamp()),
        )
    )

✅ Why Dispytch?

  • 🧼 Minimal boilerplate – Just annotate and go
  • 🧪 Testable logic – Handlers are first-class coroutines
  • 🔄 Flexible backends – Kafka, RabbitMQ, or bring your own
  • 🧩 Clean separation of concerns – business logic ≠ plumbing

⚠️ Limitations

While dispytch is a great choice for most usecases there are some limitations to be aware of:

🧾 No schema-on-write support Dispytch uses a schema-on-read model. Formats like Avro, Protobuf, or Thrift aren’t supported yet.

🕵️ No dead-letter queue (DLQ) Failed messages are retried using built-in logic, but there’s no DLQ or fallback mechanism after final retries yet.

🧩 No topic pattern matching Wildcard or templated subscriptions (e.g. user.*, order:{id}:events) aren’t supported in handler declarations yet. Though the backend of you choice may route events to the appropriate queues/topics/channels there is no way for a dispytch handler to know it yet


💡 See something missing? Some features aren’t here yet—but with your help, they could be. Contributions welcome via PRs or discussions.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dispytch-0.9.0.tar.gz (113.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dispytch-0.9.0-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file dispytch-0.9.0.tar.gz.

File metadata

  • Download URL: dispytch-0.9.0.tar.gz
  • Upload date:
  • Size: 113.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.0

File hashes

Hashes for dispytch-0.9.0.tar.gz
Algorithm Hash digest
SHA256 f51f48d028eaa6a9db2f8ad96de17e3b27755a34e7f2c8fd4c9ae9c7fd83afc2
MD5 496f77965f9fa4641286203fa46eb345
BLAKE2b-256 31311865e56469e8a5f5c6d7c9abfd4d2b85dccb2202b9062ec59f9fc8c79f41

See more details on using hashes here.

File details

Details for the file dispytch-0.9.0-py3-none-any.whl.

File metadata

  • Download URL: dispytch-0.9.0-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.0

File hashes

Hashes for dispytch-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1715cd723b13262c8bcf6863730f3682445d5bf7444c501b7a550b5e3f0917ab
MD5 d3552d6ce9ad9fad862ce46b779d77d7
BLAKE2b-256 200e105fa2056f4238af5f7e9269eb6b48b21494955d6ac8159315fa55d211f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page