私はこの質問を書いている間に解決策を見つけ、他の誰かもそれを利用するかもしれないと思いました!ここでの質問のほとんどは2.0以前のチャネルバージョンに関するものであるため、これがコンシューマーでgroup_sendイベントを処理する方法です。
問題は、group_send
の使用方法だけではありませんでした。 ただし、関数ではありますが、グループクラス変数をEventConsumerに追加すると、自動的にその/それらのグループに追加されると誤って想定していましたが、そうではありません。 connect
で手動でグループを追加する必要があります 関数をクラス化し、disconnect
のグループを削除します 機能!
問題は、私のコンシューマーに適切なイベントハンドラーが指定されていないことにもありました。アラーム要求が取り込まれるビューファイルで、「type」を「test」に設定しました。テストがEventConsumerクラスに反映されなかったため、イベントを処理できませんでした。ここの行番号146のマルチチャットの例に示されているように、ヘルパー関数は、送信されたイベントのタイプに応じて呼び出されます。したがって、「event.alarm」のイベントタイプには、対応するevent_alarm
の関数が必要です。 あなたの消費者に!単純ですが、あまり文書化されていません:)。最終的な解決策は次のようになります。
consumers.py
内 、group_add
に注意してください 接続およびgroup_discard
切断中!
class EventConsumer(JsonWebsocketConsumer):
def connect(self):
async_to_sync(self.channel_layer.group_add)(
'events',
self.channel_name
)
self.accept()
def disconnect(self, close_code):
print("Closed websocket with code: ", close_code)
async_to_sync(self.channel_layer.group_discard)(
'events',
self.channel_name
)
self.close()
def receive_json(self, content, **kwargs):
print("Received event: {}".format(content))
self.send_json(content)
# ------------------------------------------------------------------------------------------------------------------
# Handler definitions! handlers will accept their corresponding message types. A message with type event.alarm
# has to have a function event_alarm
# ------------------------------------------------------------------------------------------------------------------
def events_alarm(self, event):
self.send_json(
{
'type': 'events.alarm',
'content': event['content']
}
)
したがって、上記の関数events_alarm
次のgroup_send
から呼び出されます :
from django.shortcuts import HttpResponse
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def alarm(req):
layer = get_channel_layer()
async_to_sync(layer.group_send)('events', {
'type': 'events.alarm',
'content': 'triggered'
})
return HttpResponse('<p>Done</p>')
質問/回答についてさらに説明が必要な場合はお知らせください。乾杯!