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

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

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

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

Python

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

Q&A

解決済

1回答

1515閲覧

Django channels views.pyから特定roomにwebsocket送信

Y.NINOMIYA

総合スコア32

Django

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

Python

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

0グッド

0クリップ

投稿2021/04/04 02:44

編集2021/04/04 05:54

お世話になります。

質問は表題の通り、views.pyから特定ルームへメッセージを送信する方法です。

昨日からchannelsを触りはじめたため、ドキュメントもどこを読めばいいのかよくわかりません。
チュートリアルは終えたため基本的なところはできます。

試したコード

Python

1# consumer.py 2class ChatConsumer(WebsocketConsumer): 3   • 4   • 5   • 6 def receive_view(self, roomname): 7 # Send message to room group 8 async_to_sync(self.channel_layer.group_send)( 9 roomname, 10 { 11 'type': 'chat_message', 12 'message': “template message” 13 } 14 ) 15 def send_temp_message(self, event): 16 message = event['message'] 17 self.send(text_data=json.dumps({ 18 'message': message 19 })) 20

Python

1# views.py 2from .consumer import ChatConsumer 3   • 4   • 5   • 6ChatConsumer.recieve(roomname)

shell

1Internal Server Error: /chat/send/test 2Traceback (most recent call last): 3 File "/usr/local/lib/python3.8/dist-packages/asgiref/sync.py", line 339, in thread_handler 4 raise exc_info[1] 5 File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/exception.py", line 38, in inner 6 response = await get_response(request) 7 File "/usr/local/lib/python3.8/dist-packages/django/core/handlers/base.py", line 233, in _get_response_async 8 response = await wrapped_callback(request, *callback_args, **callback_kwargs) 9 File "/usr/local/lib/python3.8/dist-packages/asgiref/sync.py", line 304, in __call__ 10 ret = await asyncio.wait_for(future, timeout=None) 11 File "/usr/lib/python3.8/asyncio/tasks.py", line 455, in wait_for 12 return await fut 13 File "/usr/lib/python3.8/concurrent/futures/thread.py", line 57, in run 14 result = self.fn(*self.args, **self.kwargs) 15 File "/usr/local/lib/python3.8/dist-packages/asgiref/sync.py", line 343, in thread_handler 16 return func(*args, **kwargs) 17 File "/channels-test/mysite/chat/views.py", line 15, in send 18 ChatConsumer.send_notification()

どなたか詳しい方、回答よろしくお願いいたします。

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

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

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

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

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

y_waiwai

2021/04/04 02:48

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
guest

回答1

0

自己解決

一応非同期にしました。

python

1## consumer.py 2 3import json 4from asgiref.sync import async_to_sync 5from channels.generic.websocket import AsyncWebsocketConsumer 6 7class ChatConsumer(AsyncWebsocketConsumer): 8 async 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 12 # Join room group 13 await self.channel_layer.group_add( 14 self.room_group_name, 15 self.channel_name 16 ) 17 18 await self.accept() 19 20 async def disconnect(self, close_code): 21 # Leave room group 22 await self.channel_layer.group_discard( 23 self.room_group_name, 24 self.channel_name 25 ) 26 27 # Receive message from WebSocket 28 async def receive(self, text_data): 29 text_data_json = json.loads(text_data) 30 message = text_data_json['message'] 31 32 # Send message to room group 33 await self.channel_layer.group_send( 34 self.room_group_name, 35 { 36 'type': 'chat_message', 37 'message': message 38 } 39 ) 40 41 # Receive message from room group 42 async def chat_message(self, event): 43 message = event['message'] 44 45 # Send message to WebSocket 46 await self.send(text_data=json.dumps({ 47 'message': message 48 })) 49 50 async def view_noti(self, event): 51 print ("2") 52 message = event['message'] 53 54 # Send message to WebSocket 55 await self.send(text_data=json.dumps({ 56 'message': message 57 })) 58

python

1# views.py 2 3from channels.layers import get_channel_layer 4from asgiref.sync import async_to_sync 5 6def send(request): 7 channel_layer = get_channel_layer() 8 async_to_sync(channel_layer.group_send)("chat_aaa", { 9 "type": "view_noti", 10 "message": "viewから送信試験" 11 }) 12 return HttpResponse("OK")

aaaというルーム名で作成した場合、consumerでchat_が追加されていたのでchat_aaaとなります。

投稿2021/04/06 15:29

Y.NINOMIYA

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問