Здравствуйте.
Пытаюсь разобраться как работает библиотека
channels для Django.
Никак не могу понять как формируется метод base_send для классов *Consumer (AsyncConsumer, SyncConsumer и т.п.).
Все классы *Consumer наследуются от AsyncConsumer и в них есть метод send, который вызывает self.base_send:
def send(self, message):
"""
Overrideable/callable-by-subclasses send method.
"""
self.base_send(message)
base_send в AsyncConsumer задаётся только в одном месте - метод __call_ в следующем виде:
class AsyncConsumer:
"""
Base consumer class. Implements the ASGI application spec, and adds on
channel layer management and routing of events to named methods based
on their type.
"""
async def __call__(self, receive, send):
"""
Dispatches incoming messages to type-based handlers asynchronously.
"""
...
# Store send function
if self._sync:
self.base_send = async_to_sync(send)
else:
self.base_send = send
...
Но смотря в работающий код нигде после инициализации экземпляра класса *Consumer не происходит вызов метода __call__ с этими магическими аргументами "receive, send"
Мне уже даже не хочется делать то, из-за чего я полез в эти дебри, а хочется узнать как это работает.
Люди добрые, дайте помощь, недостаток знаний даёт о себе знать)
Классы AsyncConsumer, SyncConsumer -
здесь
Работа происходит непосредственно с классом WebsocketConsumer(SyncConsumer), который
здесь
Рабочий код:
class CommandsConsumer(WebsocketConsumer):
def connect(self):
# create connection to server once
self.accept()
def disconnect(self, close_code='0'):
print('Web-socket connection closed with code {}'.format(close_code))
def receive(self, text_data):
text_data_json = json.loads(text_data)
self.send(text_data=json.dumps({
'message': str(text_data_json['message'])
}))