django channelsでチャットアプリを作ろうとしているのですが、下のコードのrecieve関数とchat_message関数の違いを教えていただきたいです。自分的にはrecieve関数は自分が打った文字についてで、chat_messageは第三者が打った文字について扱っているのかなと思っています。初歩的な質問ですが、できるだけわかりやすく説明してくださると助かります。
また、この二つの関数で受け取った文字をwebsocketやroom groupに送るようになってますが、このときjs部分では送られてきた文字はeventのなかに格納されているということでいいんでしょうか。
consumers.py
Python
1from asgiref.sync import async_to_sync 2from channels.generic.websocket import WebsocketConsumer 3import json 4 5 6class ChatConsumer(WebsocketConsumer): 7 8 def connect(self): 9 self.room_name = self.scope['url_route']['kwargs']['room_name'] 10 # 元のコードは→self.room_group_name = 'chat_%s' % self.room_name 11 self.room_group_name = 'chat_{}'.format(self.room_name) 12 13 # Join room group 14 async_to_sync(self.channel_layer.group_add)( 15 self.room_group_name, 16 self.channel_name 17 ) 18 19 self.accept() 20 21 def disconnect(self, close_code): 22 # Leave room group 23 async_to_sync(self.channel_layer.group_discard)( 24 self.room_group_name, 25 self.channel_name 26 ) 27 28 # Receive message from WebSocket 29 def receive(self, text_data, **kwargs): 30 text_data_json = json.loads(text_data) 31 message = text_data_json['message'] 32 33 # Send message to room group 34 async_to_sync(self.channel_layer.group_send)( 35 self.room_group_name, 36 { 37 'type': 'chat_message', 38 'message': message 39 } 40 ) 41 42 # Receive message from room group 43 def chat_message(self, event): 44 message = event['message'] 45 46 # Send message to WebSocket 47 self.send(text_data=json.dumps({ 48 'message': message 49 }))
JS
1 var roomName = {{ room_name_json }}; 2 3 var chatSocket = new WebSocket( 4 'ws://' + window.location.host + 5 '/ws/chat/' + roomName + '/'); 6 7 chatSocket.onmessage = function(e) { 8 var data = JSON.parse(e.data); 9 var message = data['message']; 10 document.querySelector('#chat-log').value += (message + '\n'); 11 }; 12 13 chatSocket.onclose = function(e) { 14 console.error('Chat socket closed unexpectedly'); 15 }; 16 17 document.querySelector('#chat-message-input').focus(); 18 document.querySelector('#chat-message-input').onkeyup = function(e) { 19 if (e.keyCode === 13) { // enter, return 20 document.querySelector('#chat-message-submit').click(); 21 } 22 }; 23 24 document.querySelector('#chat-message-submit').onclick = function(e) { 25 var messageInputDom = document.querySelector('#chat-message-input'); 26 var message = messageInputDom.value; 27 chatSocket.send(JSON.stringify({ 28 'message': message 29 })); 30 31 messageInputDom.value = ''; 32 };
あなたの回答
tips
プレビュー