Django Signals extension for unifying data passed to receivers.
Project description
Django Unified Signals
This package extends behavior of the Django Signals, by unifying the data passed when the signal is sent. That way both: the sender and the receiver can be sure that the data passed is always of the same type.
Django Signals are not very strict on the data that can be passed with send method. Basically anything can be passed as the arguments and receivers need to be aware of that from the project documentation. It gets even worse when on one side the signal send params change and the receivers' maintainers may not be aware of that. It gets even worse, when using send_robust method, which ignores all exceptions and any errors may pass without being noticed.
Using this package you have to define the message type class which object
is always expected to be passed when sending the signal. That way receiver
knows what type of message will be received. This package automates the process
of checking if the send message is following the contract.
Installation
The package is available on PyPI:
pip install django-unified-signals
Usage
Let's start by defining the message structure. It can be any class you want.
In the example we will use dataclass
:
import dataclasses
@dataclasses.dataclass
class UserMessage:
name: str
age: int
Now that we have the message structure defined, we can create the signal:
from unified_signals import UnifiedSignal
user_deactivated_signal = UnifiedSignal(UserMessage)
It extends the standard django.dispatch.Signal
class,
so it can be used in the same way.
user_deactivated_signal.send(sender, UserMessage(name='John', age=30))
The receiver can be defined in the same way as for the standard Django Signal:
@receiver(user_deactivated_signal)
def handle_user_deactivated(sender, message: UserMessage, **kwargs):
print(message.name)
print(message.age)
...
The difference is that the message is always of the same type, so the receiver
can be sure that the message is always of the same type. If the message is not
of the expected type when sending the signal, the unified_signals.exceptions.UnifiedSignalMessageTypeError
exception will be raised.
user_deactivated_signal.send(sender, 'not a message') # raises UnifiedSignalMessageTypeError
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
Built Distribution
File details
Details for the file django_unified_signals-0.2.0.tar.gz
.
File metadata
- Download URL: django_unified_signals-0.2.0.tar.gz
- Upload date:
- Size: 3.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.2 Windows/11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a1718df3435b93185aa8ff47aba847f4b61f26f717aad4215721d5e3b8763662 |
|
MD5 | 9fc407c30b51412e7873d0b45776215e |
|
BLAKE2b-256 | e394fe71c8c6a6700939a7610974b034b63f263a0e3815b9f0c419d521963b57 |
File details
Details for the file django_unified_signals-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: django_unified_signals-0.2.0-py3-none-any.whl
- Upload date:
- Size: 4.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.2 Windows/11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 159bb365db2ffc6a0e0d665b185ae70515e6d32cea241b4e311f6479432778c5 |
|
MD5 | 129b7093c2f28804bee32f08870f1c37 |
|
BLAKE2b-256 | b4fa642993b3adc4ab82f702138061bc9415e13e5f571ae47adf5fde5b949d96 |