質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

2108閲覧

Django Channels によるメッセージの受け渡しについて

inori10

総合スコア17

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/03/07 01:44

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 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argparse

2020/03/13 02:54

コードがあってその意味が分からないというのは、何処か参考になさったサイトがおありという事でしょうか? 宜しければ御併記下さい。
inori10

2020/03/13 12:16

https://poyo.hatenablog.jp/entry/2018/05/17/233000 こちら参考にさせていただきました。 一通り作り終わって、考え直した結果 recieveの方は自分が送信したものについてで、chat_messageの方は自分も他人も両方含めてチャットをするテキストエリア に送る文字について扱っているのではないかと結論づけました。 間違ってたらご指摘いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問