Django websocket не может отправить данные клиенту после их получения
class WSTestView(WebsocketConsumer):
def connect(self):
self.accept();
self.send(json.dumps({'status': 'sent'})) # client receives this
def receive(self, text_data=None, bytes_data=None):
notifications = Notification.objects.filter(receiver=text_data) # receives user id
serializer = NotificationSerializer(notifications, many=True).data
self.send(serializer) # client does not receives this
Frontend
// ...
useEffect(() => {
socket.onmessage = (e) => { console.log(e.data) }
}, [])
// ...
Я только начал работать с django-channels и работаю над потребителем, который отправляет уведомления пользователю, когда получает его id, но на фронтенде событие onmessage ничего не получает, как я могу это исправить и есть ли лучший способ, которым я могу это реализовать?
Вероятно, это ваш front end, а не django-channels, если вы можете подключиться к нему. Наиболее вероятной причиной является то, что ваш onmessage связывается после того, как из-за компонентаDidMount/useEffect сервер уже отправил сообщение.
Попробуйте просто как тест, чтобы исключить это. Чтобы поставить
socket.onmessage = (e) => { console.log(e.data) }
Сразу после new WebSocket.... Дайте мне знать, если это выведет что-то в консоль. Другой способ проверить/изолировать это с помощью онлайнового тестера WebSocket, например, такой https://www.lddgo.net/en/network/websocket
class WSTestView(WebsocketConsumer):
def connect(self):
self.accept();
self.send(json.dumps({'status': 'sent'}))
def receive(self, text_data=None, bytes_data=None):
notifications = Notification.objects.filter(receiver=text_data) # receives user id
serializer = NotificationSerializer(notifications, many=True).data
self.send(json.dumps(serializer)) # <-------
- Нужно преобразовать сериализованные данные в строку JSON.
Frontend
useEffect(() => {
socket.onmessage = (e) => { console.log(e.data) }
}, [socket]) // <-------
- Нужно поместить переменную socket в массив зависимостей