Реализация простого потока отправленных событий сервером с Django каналами - PullRequest
2 голосов
/ 02 апреля 2020

Django Документация по каналам имеет следующий базовый c пример отправленных сервером событий. AsyncHttpConsumer

from datetime import datetime
from channels.generic.http import AsyncHttpConsumer

class ServerSentEventsConsumer(AsyncHttpConsumer):
    async def handle(self, body):
        await self.send_headers(headers=[
            (b"Cache-Control", b"no-cache"),
            (b"Content-Type", b"text/event-stream"),
            (b"Transfer-Encoding", b"chunked"),
        ])
        while True:
            payload = "data: %s\n\n" % datetime.now().isoformat()
            await self.send_body(payload.encode("utf-8"), more_body=True)
            await asyncio.sleep(1)

Я хочу принимать сообщения, отправленные через channel_layer, и отправлять их как события.

Я изменил метод handle, поэтому он подписывает новый канал на группа. И я планирую отправлять сообщения на уровень канала через channel_layer.group_send

Но я не мог понять, как получать сообщения, отправленные группе, в рамках метода handle. Я пытался дождаться channel_layer.receive, похоже, он не работает.

class ServerSentEventsConsumer(AsyncHttpConsumer):
    group_name = 'my_message_group'

    async def myevent(self, event):
        # according to the docs, this method will be called \
        #    when a group received a message with type 'myevent'
        # I'm not sure how to get this event within `handle` method's while loop.
        pass

    async def handle(self, body):

        await self.channel_layer.group_add(
            self.group_name,
            self.channel_name
        )
        await self.send_headers(headers=[
            (b"Cache-Control", b"no-cache"),
            (b"Content-Type", b"text/event-stream"),
            (b"Transfer-Encoding", b"chunked"),
        ])
        while True:
            payload = "data: %s\n\n" % datetime.now().isoformat()
            result = await self.channel_receive()
            payload = "data: %s\n\n" % 'received'

Я отправляю сообщения на channel_layer, как показано ниже: (из команды управления)

def send_event(event_data):
    group_name = 'my_message_group'
    channel_layer = get_channel_layer()
    async_to_sync(channel_layer.group_send)(
        group_name,
        {
            'type': 'myevent',
            'data': [event_data]
        }
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...