मैंने इस प्रश्न को लिखते समय इसका हल ढूंढा और सोचा कि कोई और भी इसका उपयोग कर सकता है! चूंकि यहां अधिकांश प्रश्न 2.0 और उससे पहले के चैनल संस्करण के बारे में हैं, इसलिए आपको अपने उपभोक्ताओं में group_send ईवेंट को इस तरह से हैंडल करना चाहिए।
समस्या केवल यह नहीं थी कि मैंने group_send
. का उपयोग कैसे किया? फ़ंक्शन हालांकि, मैंने गलत तरीके से मान लिया था कि समूह वर्ग चर को मेरे EventConsumer में जोड़ना स्वचालित रूप से उस/उन समूहों में जोड़ना चाहिए, ऐसा नहीं है! आपको connect
. में मैन्युअल रूप से समूह जोड़ना होगा क्लास फ़ंक्शन और disconnect
. में समूहों को हटा दें समारोह!
तब समस्या यह भी थी कि मेरे उपभोक्ता के पास उचित ईवेंट हैंडलर निर्दिष्ट नहीं थे। मेरी दृश्य फ़ाइल में, जहां अलार्म अनुरोध लिया जाता है, मैंने 'प्रकार' को 'परीक्षण' पर सेट किया था। मेरे 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>')
कृपया मुझे बताएं कि क्या आपको प्रश्न/उत्तर के लिए और स्पष्टीकरण की आवश्यकता है! चीयर्स!