كيفية إرسال إشعارات المستخدم باستخدام قنوات django 2.0؟

0

أنا أعمل على تطبيق دردشة به غرف. لكل غرفة مستخدمان. يمكن أن يكون المستخدم في غرف متعددة أي أن المستخدم لديه غرف متعددة. وهو الآن يتحدث في غرفة واحدة. لكنه يتلقى رسالة في غرفة أخرى. أود أن أبلغ عن رسالة من غرفة أخرى للمستخدم. كيف يمكنني تنفيذ ذلك؟

يتم حاليًا إنشاء اتصال websocket على النحو التالي: ws://localhost:8000/chat/int<room_id>/

واسم group_name يدعى "room"+room_id . وحتى الآن لدي:

async def connect(self):
    room_id = self.scope['url_route']['kwargs']['room_id']
    await self.channel_layer.group_add(
            "room"+room_id,
            self.channel_name
        )
    await self.accept()

async def receive(self, text_data):
    await self.channel_layer.group_send(
        self.room_name,
        {
            'type': 'chat_message',
            'message': json.loads(text_data)
        }
    )
async def chat_message(self, event):
    await self.send(text_data=json.dumps({
        'message': event['message']
    }))

Django 2.x django-channel 2.x python 3.6

2 الاجابة

0

أنت بحاجة إلى نموذجين على الأقل Message ، MessageThread . عندما يتصل المستخدم بالمقبس ، تتم إضافة القناة إلى كل مجموعة مؤشرات ترابط يتم تضمين المستخدم فيها. عليك أيضًا إضافة اسم_القناة إلى جلسة المستخدم.

messaging/models.py

class MessageThread(models.Model):
    title = models.CharField()
    clients = models.ManyToManyField(User, blank=True)

class Message(models.Model):
    date = models.DateField()
    text = models.CharField()
    thread = models.ForeignKey('messaging.MessageThread', on_delete=models.CASCADE)
    sender = models.ForeignKey(User, on_delete=models.SET_NULL)

chat/consumers.py

class ChatConsumer(WebSocketConsumer):
    def connect(self):
        if self.scope['user'].is_authenticated:
            self.accept()
            # add connection to existing groups
            for thread in MessageThread.objects.filter(clients=self.scope['user']).values('id'):
                async_to_sync(self.channel_layer.group_add)(thread.id, self.channel_name)
            # store client channel name in the user session
            self.scope['session']['channel_name'] = self.channel_name
            self.scope['session'].save()

    def disconnect(self, close_code):
        # remove channel name from session
        if self.scope['user'].is_authenticated:
            if 'channel_name' in self.scope['session']:
                del self.scope['session']['channel_name']
                self.scope['session'].save()
            async_to_sync(self.channel_layer.group_discard)(self.scope['user'].id, self.channel_name)
:مؤلف
0

أفعل شيئًا مشابهًا ، يمكنك تجربة شيء مثل هذا:

connect(message):
    // however you get your chatroom value from the socket
    Group("%s" % chatroom).add(message.reply_channel)

message(message):
    message = json.loads(message.content['text'])
    chatroom = message['chatroom']  
    Group("%s" % chatroom).send({
            "text": json.dumps({
                "id": "newuser",
                "username": message['username'],
                "message": message['message']
            })
        })

ربما أساءت قراءة سؤالك. ربما شيء أشبه:

أنشئ معرفًا فريدًا لكل مستخدم واستخدم هذه القيمة كـ "غرفة محادثة" ، ثم أرسل كل رسالة برقم غرفة الدردشة ورقم المستخدم الذي يجب أن تذهب إليه. يمكن لـ Django تفسير هوية المستخدم وإرسال الرسالة إلى القناة الصحيحة ، ثم جعل جافا سكريبت يفسرها الرسالة ورقم الغرفة لإحضارهم إلى الصفحة الصحيحة؟

هذه فكرة مثيرة للاهتمام

:مؤلف
فوق
قائمة طعام