Inspired by channels
, Nejma ⭐ allows you manage and send messages to groups of channels
Things you can build with nejma
:
- chat
- notification
- handle users connected from multiple tabs)
- and more...
Take a look at this example nejma-chat
, a simple chat application built using nejma
and starlette
.
$ pip install nejma
Here's an example of using nejma
with websockets.
First import Channel and channel_layer from nejma
from nejma import Channel, channel_layer
Create a channel on connect
async def on_connect(self, websocket, **kwargs):
await super().on_connect(websocket, **kwargs)
self.channel = Channel(send=websocket.send)
Add groups, channels or send messages
async def on_receive(self, websocket, data):
self.channel_layer.add(group, self.channel)
await self.channel_layer.group_send(group, "Welcome !")
Finnaly, remove the channel once the connection is closed
async def on_disconnect(self, websocket, close_code):
self.channel_layer.remove_channel(self.channel)
To use nejma
with starlette
, simply import the WebSocketEndpoint from nejma
from nejma.ext.starlette import WebSocketEndpoint
@app.websocket_route("/ws")
class Chat(WebSocketEndpoint):
encoding = "json"
async def on_receive(self, websocket, data):
room_id = data['room_id']
message = data['message']
username = data['username']
if message.strip():
group = f"group_{room_id}"
self.channel_layer.add(group, self.channel)
payload = {
"username": username,
"message": message,
"room_id": room_id
}
await self.channel_layer.group_send(group, payload)
The ChannelLayer
class provided by nejma
exposes the following methods :
add(group, channel, send=None)
Adds a channel to a giving group.
- send : method to send messages to a channel
self.channel_layer.add(group, self.channel, send=websocket.send)
async group_send(group, "Welcome !")
Sends a message to a group of channels
await self.channel_layer.group_send(group, "Welcome !")
remove(group, channel)
Removes a channel from a given group
self.channel_layer.remove(group, self.channel)
remove_channel(channel)
Removes a channel from all the groups
self.channel_layer.remove_channel(self.channel)
flush()
Reset all the groups
self.channel_layer.flush()