Как я могу уведомлять пользователей в режиме реального времени, когда добавляется новая задача с Django Каналами? - PullRequest
0 голосов
/ 06 марта 2020

Как мне уведомить всех пользователей о добавлении новой задачи в административную панель django? На данный момент это может быть просто сообщение, но цель состоит в том, чтобы добавить новую задачу в массив без обновления страницы.

Возможно, у кого-то есть примеры. Был бы очень признателен.

Вот мой код:

Пакеты:

Django==2.2.3
channels==2.2.0
channels-redis==2.4.0

routing.py

from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path

from api.consumers import TaskConsumer

application = ProtocolTypeRouter({
    "websocket": URLRouter([
        path('notifications/', TaskConsumer),
    ])
})

consumer.py

from channels.generic.websocket import AsyncJsonWebsocketConsumer


class TaskConsumer(AsyncJsonWebsocketConsumer):

    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add("gossip_tasks", self.channel_name)

    async def disconnect(self, close_code):
        await self.channel_layer.group_discard("gossip_tasks", self.channel_name)

    async def user_tasks(self, event):
        await self.send_json(event)

signal.py

from tasks.models import Task
from django.db.models.signals import post_save
from django.dispatch import receiver
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer


@receiver(post_save, sender=Task)
def announce_new_task(sender, instance, created, **kwargs):
    if created:
        message = {
            "title": instance.title,
            "description": instance.description,
            "criticity": instance.criticity.name,
            "location": instance.location.name,
            "task_type": instance.type.name,
            "status": instance.status,
        }
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "gossip_tasks",
            {
                'type': 'user.tasks',
                'text': message
            }
        )

index. html (сейчас я просто хочу показать новое задание в консоли)

<script>
    document.addEventListener('DOMContentLoaded', function () {
        const webSocketBridge = new channels.WebSocketBridge();

        webSocketBridge.connect('ws://backend.local:8888/notifications/');
        webSocketBridge.listen(function (action, stream) {
            console.log("RESPONSE:", action);
        });
        document.ws = webSocketBridge; /* for debugging */
    });
</script>

CHANNEL_LAYER

redis_host = os.environ.get('REDIS_HOST', 'localhost')
redis_port = int(os.environ.get('REDIS_PORT', '6379'))
redis_prefix = os.environ.get('REDIS_PREFIX', 'fa3ahCei')

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [(redis_host, redis_port)],
            "prefix": redis_prefix
        },
    },
}

У меня нет ни одного ошибка в консоли браузера, и когда я добавляю новую задачу, ничего не происходит ...

У меня просто есть ошибки в журналах

172.28.0.5:56132 - - [06/Mar/2020:16:02:12] "WSCONNECTING /notifications/" - -
172.28.0.5:56132 - - [06/Mar/2020:16:02:12] "WSCONNECT /notifications/" - -
172.28.0.5:56132 - - [06/Mar/2020:16:02:22] "WSDISCONNECT /notifications/" - -
172.28.0.5:56154 - - [06/Mar/2020:16:02:22] "WSCONNECTING /notifications/" - -
172.28.0.5:56154 - - [06/Mar/2020:16:02:22] "WSCONNECT /notifications/" - -
2020-03-06 16:02:22,522 ERROR    Exception in callback AsyncioSelectorReactor.callLater.<locals>.run() at /usr/local/lib/python3.8/site-packages/twisted/internet/asyncioreactor.py:287
handle: <TimerHandle when=28820.238468155 AsyncioSelectorReactor.callLater.<locals>.run() at /usr/local/lib/python3.8/site-packages/twisted/internet/asyncioreactor.py:287>
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/asyncio/events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/local/lib/python3.8/site-packages/twisted/internet/asyncioreactor.py", line 290, in run
    f(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/daphne/server.py", line 276, in application_checker
    exception = application_instance.exception()
asyncio.exceptions.CancelledError
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...