Lightweight framework for quickly making socket consumers using Django and DjangoChannels.
Project description
Easy Channels
Lightweight framework for quickly making socket consumers using Django and DjangoChannels.
Installing
pip install django-easy-channels
Socket Example
Backend
from easy_channels import JSONConsumer
class ChatConsumer(JSONConsumer):
# Socket connects
def on_connect(self):
# gets name from url
self.name = self.scope['url_route']['kwargs']['name']
# Adds socket and consumer to group chatroom
self.group_add('chatroom')
# Accepts socket connection
self.accept()
# Called when consumer receives a message with the event broadcast_message
def on_broadcast_message(self, event):
payload = {
'message': event['message'],
'from': self.name
}
# Sends this message to all connected sockets in the 'chatroom' group (not consumers)
await self.group_send(
'chatroom', # group
'message', # event name
payload # data
)
Frontend
const messages = [];
const socket = new WebSocket("wss://YOUR_URL/chat/joselito");
// Called when socket receives a message
socket.onmessage = function (message) {
switch (message.event) {
case "message":
messages.push({
message: message.message,
from: message.from,
});
}
};
socket.send(
JSON.stringify({
event: "broadcast_message", // Calls "on_broadcast()" function in consumer
message: "Hello World!", // Can be acessed in bachend using event['message']
})
);
Adding to Route
This JSONConsumer can be added to Django Channels route in the same way of the original consumers.
from django.urls import re_path
from .consumers import ChatConsumer
websocket_urlpatterns = [
re_path(r'^ws/chat/(?P<name>\w+)/', consumers.ChatConsumer),
]
Communicating Between Consumers
Sometimes you want your consumers to talk with each other without sending data to the front end.
For example, we can make a consumer A notify a consumer B that it needs to update its frontend information without this confidental data passing through consumer A.
class ConsumerA(JSONConsumer):
def on_connect(self):
self.group_add('groupA')
def on_notify(self):
sensitive_data = get_some_data()
self.group_send(
'groupA',
'notify',
sensitive_data
)
class ConsumerB(JSONConsumer):
def on_connect(self):
self.group_add('groupB')
def on_some_event(self):
# Calls 'on_notify()' in all consumers added to groupA
self.group_call_event(
'groupA',
'notify'
)
Middleware Example
You can create custom middlewares that will be run before the on_connect function or whenever a message is received.
The code below will automatically gather the chat user name from url.
from easy_channels.middleware import ConsumerMiddleware
class UserGatherMiddleware(ConsumerMiddleware):
# Called before the consumer's 'on_connect()'
def on_connect(self):
# This middleware has complete access to the consumer in the self.consumer attribute
self.consumer.name = self.scope['url_route']['kwargs']['name']
To the middleware to work with the consumer we must pass it.
class ChatConsumer(JSONConsumer):
middlewares = [UserGatherMiddleware]
def on_connect(self):
print(self.name) # Will print the user name
...
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django-easy-channels-0.0.1.tar.gz.
File metadata
- Download URL: django-easy-channels-0.0.1.tar.gz
- Upload date:
- Size: 3.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1a11e75ec0eda49cfac9def347b63236283238fcf3a5a690d0dcd10daf34def
|
|
| MD5 |
7940eac11e8a9210782703f9b7a47cec
|
|
| BLAKE2b-256 |
46c48c920e5dc6ed85442e6acf11f96d53baf856489e8f160214e634f2445a41
|
File details
Details for the file django_easy_channels-0.0.1-py3-none-any.whl.
File metadata
- Download URL: django_easy_channels-0.0.1-py3-none-any.whl
- Upload date:
- Size: 4.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
654134b4c4f91238fff76dcc0d0a3b3449533adc286312a0bd8bc713dc8568d0
|
|
| MD5 |
058b2d5f0e051d6fcfaa975666a0246f
|
|
| BLAKE2b-256 |
81c7eac40463a0a9f87f598bb0f1de81eb4496efbfd1edfa69dff07656088cf3
|