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!