Как мне уведомить всех пользователей о добавлении новой задачи в административную панель 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