@geesoff

Как в модуле channels определяется метод base_send?

Здравствуйте.

Пытаюсь разобраться как работает библиотека 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'])
        }))
  • Вопрос задан
  • 46 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы