Уведомления каналов Django не работают
Я пытаюсь сделать систему уведомления о запросе друга в реальном времени для проекта, над которым я работаю. Я думал, что это будет легко, потому что я уже использовал каналы для приложения чата и потому что я думаю, что нет необходимости слушать сигналы с другой стороны веб-сокета. Предположительно, это не так. Буду очень признателен, если вы сможете помочь. Я использовал JwtAuthMiddleware из django_channels_jwt_auth_middleware, он работает для моего чат-приложения. Я могу подключиться к вебсокету, но не получаю уведомление, когда пользователь отправляет запрос на дружбу. Все остальное работает нормально. Спасибо
Вот код // views.py
class SendRequestView(views.APIView):
permission_class = (permissions.IsAuthenticated,)
def post(self, request, *args, **kwargs):
receiver_username = self.kwargs['receiver_username']
if receiver_username is not None:
receiver = get_object_or_404(User, username=receiver_username)
request = ConnectRequest.objects.create(sender=self.request.user, receiver=receiver)
notification = ConnectNotification.objects.create(type='connect request', receiver=receiver, initiated_by=self.request.user)
channel_layer = get_channel_layer()
channel = f'notifications_{receiver.username}'
async_to_sync(channel_layer.group_send)(
channel, {
'type': 'notify',
'notification': json.dumps(ConnectNotificationSerializer(notification).data, cls=DjangoJSONEncoder),
}
)
data = {
'status': True,
'message': 'Success',
}
return JsonResponse(data)
// consumer.py class ConnectNotificationConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
user = self.scope['user']
group_layer = f'notifications_{user.username}'
await self.accept()
await self.channel_layer.group_add(group_layer, self.channel_name)
async def disconnect(self, close_code):
user = self.scope['user']
group_layer = f'notifications_{user.username}'
await self.channel_layer.group_discard(group_layer, self.channel_name)
async def notify(self, event):
notification = event['notification']
await self.send(text_data={
'notification': notification
}
)