Simple one-way bindings for django-channels with some specific support for django-rest-framework serializers and websockets. I.e. enrich your existing API with push notifications.
Project description
DRF channels one-way WS
Simple one-way bindings for django-channels with some specific support for django-rest-framework serializers and websockets. I.e. enrich your existing API with push notifications.
Installation
pipenv install drf-channels-oneway-ws
orpip install drf-channels-oneway-ws
Usage
Bindings
from django.db import models
from rest_framework import serializers
from channels_oneway.bindings import Binding
class Family(models.Model):
name = models.CharField(max_length=255)
class Bird(models.Model):
name = models.CharField(max_length=255)
family = models.ForeignKey('Family', models.CASCADE)
class BirdSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('__all__')
class BirdBinding(Binding):
model = Bird
stream = 'birds'
serializer = BirdSerializer
@classmethod
def group_names(cls, instance):
return [instance.family.name]
class FamilyBinding(Binding):
"""
example of a binding not using a drf serializer
"""
model = Family
stream = 'bird-families'
@classmethod
def group_names(cls, instance):
return [instance.name]
def serialize_data(self, instance):
return {'id': instance.id, 'name': instance.name}
Now you make sure you have a WebsocketConsumer, which does something like self.channel_layer.group_add('thrushes', self.channel_name)
in its connect coroutine.
Family.objects.create(name='thrushes')
will then cause the following to be sent over the associated websocket:
{
"stream": "bird-families",
"payload": {
"action": "create",
"data": {"id": 1, "name": "thrushes"},
"model": "your_app.family",
"pk": 1
}
}
Upon modification ("action": "update"
) or deletion ("action": "delete"
) you will receive messages with an equal structure.
Registration
In order to let the bindings register their signals make sure they are imported at some point. In case you use a dedicated file, import it from AppConfig.ready
just like your signals.
Helpers
In order to send a ws message from outside a binding, but using the same format (stream + payload) (and also the drf json encoder) use the async channels_oneway.utils.groupSend(group, stream, payload)
or its sync equivalent groupSendSync
.
Contributing
Installation
git clone git@github.com:evocount/drf-channels-oneway-ws.git
cd drf-channels-oneway-ws
pipenv install --dev
Running tests
pipenv run pytest --cov
License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
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
Hashes for drf-channels-oneway-ws-0.3.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | fca8159c4d439fc02cda744d868feb7ecad1ff25d75f9bcd70756b9af17c03d6 |
|
MD5 | 5a3d11eb92ab0a671832c8e4df305427 |
|
BLAKE2b-256 | 4d66da2d420473f8604dc4b3857ef6ead8bbc44a80c45112b401b1a7b9dcc616 |
Hashes for drf_channels_oneway_ws-0.3.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a6ebaec2e5985a5818b42c55090e0abf38f6f5e575595190d02bf940f7c8b1f |
|
MD5 | b35bc29e28bb0f194f9a0531d44834ae |
|
BLAKE2b-256 | f08761a937cf031bf8804a0fa51e417258dcfa132d58cef59a71853cd95f2a3f |