I would like to make a chat application using django and channels. I have
two models to achieve a chat like application.
1.
Thread - A thread can have list of users. So, it can be used for chat
between two users, or groups of user. If it's a group thread, it can have a
subject for the group (eg. group name).
2.
Message - A message is the actual message sent from one user (sender) to
a thread. And any users of thread's user list will have access to it.
class Thread(models.Model):
subject = models.CharField(max_length=255, blank=True)
user = models.ManyToManyField(User)
class Message(models.Model):
thread = models.ForeignKey(Thread)
sender = models.ForeignKey(User)
sent_datetime = models.DateTimeField(default=timezone.now)
body = models.TextField()
So, the chat app will have the basic features:
1.
Chat with a single user
When a user sends a message to a user, django will check if a thread
with both sender and recipient exists as the users. If it exist, then
create a new message with that existing thread as the foreign key. If it
doesn't exits, create a new thread, and create a new message with newly
created thread as its foreign key to the thread.
2.
Chat with a group of users
When a user creates a new group, a new thread will be created and that
user will be added to the thread's user list. More users can be added to
group later on. And any message sent will be available to all the users in
the thread's user list.
After reading the docs I am not sure how to actually layout the
architecture for the websocket and routing of the channels. I have the
following confusions:
1.
From the docs on models
<https://channels.readthedocs.io/en/stable/getting-started.html#models>,
I will have to specify the room name in the url path, and on connect, the
consumer will add the client (message.reply_channel) to that group of room
(here thread), and then any messages sent will be broadcasted to all the
users in the group. However, that is just for one room (thread). How can
the user again chat with other threads (rooms). Will I have to make a new
Websocket connection for each thread (room)?..
2.
This question is out of context of a chat app, but I need to know this
to better understand how to make the architecture. In the docs, there's
a section of live blogs
<https://channels.readthedocs.io/en/stable/concepts.html#groups> where
all the clients (message.reply_channel) are added to the "liveblog" group.
However, in this scenario, we already know that we need to connect to
"liveblog" groups. Suppose, there's a website where many authors write
their blogs, and a user is subscribed to many authors (e.g.: "Adam",
"Mary", "Robin", ...). And, if a author starts its blog, a connected user
will get notified.
So here, if the user connects to the websocket connection, on consumer,
should we add the user to all blogs listed in his/her subscription list
e.g:
for sub in subscriptions:
Group(sub).add(message.reply_channel)
Or is there some better way to handle these kinds of architecture? I really
like channels, and if anyone can help me understand and guide through these
concepts I will really appreciate the help.
Sincerely,
Robin
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/CA%2B4-nGrMeAZGzmJAL95BsJAG5q%3D-NWw0_Yb-KNnyFNnV%2BCCz3w%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.