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

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

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

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

WebSocket

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

Q&A

解決済

1回答

686閲覧

django AsyncWebsocketConsumerについて

etcetera

総合スコア24

Django

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

WebSocket

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

0グッド

0クリップ

投稿2021/12/23 14:24

AsyncWebsocketConsumerのドキュメントの下記のコードにおいて、groups=["broadcast"]の部分は何をしているのでしょうか?
この部分を削除しても問題なく動作するので、何が行われているのかがわかりません。ご教授お願いします。

python

1from channels.generic.websocket import AsyncWebsocketConsumer 2 3class MyConsumer(AsyncWebsocketConsumer): 4 groups = ["broadcast"] 5 6 async def connect(self): 7 # Called on connection. 8 # To accept the connection call: 9 await self.accept() 10 # Or accept the connection and specify a chosen subprotocol. 11 # A list of subprotocols specified by the connecting client 12 # will be available in self.scope['subprotocols'] 13 await self.accept("subprotocol") 14 # To reject the connection, call: 15 await self.close() 16 17 async def receive(self, text_data=None, bytes_data=None): 18 # Called with either text_data or bytes_data for each frame 19 # You can call: 20 await self.send(text_data="Hello world!") 21 # Or, to send a binary frame: 22 await self.send(bytes_data="Hello world!") 23 # Want to force-close the connection? Call: 24 await self.close() 25 # Or add a custom WebSocket error code! 26 await self.close(code=4123) 27 28 async def disconnect(self, close_code): 29 # Called when the socket closes

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

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

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

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

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

guest

回答1

0

ベストアンサー

groupsフィールドは親クラスの「AsyncWebsocketConsumer」のフィールド変数です。

AsyncWebsocketConsumerクラスの実装を一部抜粋すると以下ですが、

python

1 groups = None 2 3 def __init__(self, *args, **kwargs): 4 if self.groups is None: 5 self.groups = [] 6 7 async def websocket_connect(self, message): 8 """ 9 Called when a WebSocket connection is opened. 10 """ 11 try: 12 for group in self.groups: 13 await self.channel_layer.group_add(group, self.channel_name) 14 except AttributeError: 15 raise InvalidChannelLayerError( 16 "BACKEND is unconfigured or doesn't support groups" 17 )

groupsにグループ名リストを設定しておくと、グループ名ごとにchannel_layerにチャンネル名を追加するような処理を行っているようです。

WebSocketを使ったアプリを作った事が無いのでここからは想像で言いますが、
通常のWebの場合、自分がリクエストしたらレスポンスは自分だけに返しますが、例えばWebSocketを使ったチャットアプリ等で考えた場合、誰かが発言したら全員にレスポンスを送信する必要がありますよね。なのでアプリに接続している人をグループという単位で管理するようになってるんじゃないでしょうか。

「問題なく動いた」と言われていますが、複数人で接続しての確認をされたんでしょうか?もしかするとその行を消すと他の人に届かない、という事かもしれません。

ただ、見た感じそのソースはかなり簡易的なサンプルのようなので、groupの設定方法としては「とりあえず何か付けておく」程度のやり方にも見えます。

ググってると以下のように、connect関数の中で名前作って、自分でグループに追加する処理を書くやり方も見つかります。

python

1 2 async def connect(self): 3 self.room_name = self.scope['url_route']['kwargs']['room_name'] 4 self.room_group_name = 'chat_%s' % self.room_name 5 6 # Join room group 7 await self.channel_layer.group_add( 8 self.room_group_name, 9 self.channel_name 10 ) 11 12 await self.accept()

このように自分で設定する場合は、その行は要らないのかもしれません。

投稿2021/12/24 00:43

umau

総合スコア805

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

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

etcetera

2021/12/24 05:47

なるほど、自分はconnect関数の中で、グループに追加する処理を書いていたので、問題なく動作したのだと思います! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問