Saya menemukan solusinya saat menulis pertanyaan ini dan berpikir bahwa orang lain mungkin juga memanfaatkannya! Karena sebagian besar pertanyaan di sini adalah tentang saluran versi sebelum 2.0 dan di atasnya, ini adalah bagaimana Anda harus menangani peristiwa group_send di konsumen Anda.
Masalahnya tidak hanya terletak pada cara saya menggunakan group_send fungsi meskipun, saya salah berasumsi bahwa menambahkan variabel kelas grup ke EventConsumer saya harus secara otomatis menambahkannya ke grup itu/itu, TIDAK! Anda harus menambahkan grup secara manual di connect fungsi kelas dan hapus grup di disconnect fungsi!
Masalahnya kemudian juga terletak pada bahwa konsumen saya tidak memiliki penangan acara yang tepat. Dalam file tampilan saya, tempat permintaan alarm diambil, saya telah mengatur 'ketik' ke 'pengujian'. Tes tidak tercermin di kelas EventConsumer saya sehingga acara tidak dapat diproses. Seperti yang dicatat dalam contoh multichat di sini pada baris nomor 146, fungsi pembantu dipanggil tergantung pada jenis acara yang dikirim. Jadi jenis acara 'event.alarm' harus memiliki fungsi event_alarm yang sesuai di konsumen Anda! Sederhana, tetapi tidak didokumentasikan dengan baik :). Inilah solusi akhirnya:
Di consumers.py , perhatikan group_add di connect dan group_discard terputus!
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']
}
)
Jadi, fungsi di atas events_alarm dipanggil dari group_send berikut :
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>')
Tolong beri tahu saya jika Anda memerlukan klarifikasi lebih lanjut untuk pertanyaan/jawaban! Semangat!