Как получить данные с клиентской стороны веб-сокета в Django, используя каналыPython

Программы на Python
Ответить
Anonymous
 Как получить данные с клиентской стороны веб-сокета в Django, используя каналы

Сообщение Anonymous »

Я пытаюсь получить сообщение веб-сокета на стороне сервера. Оно не принимается. Я неправильно использую эту функцию? Как следует реализовать эту функцию, чтобы получать сообщения и параллельно запускать обновления 30s в режиме реального времени.
Я создал веб-сервер, используя каналы Django (Daphne) на Python.
Он отправляет данные асинхронно клиенту через веб-сокет для обновления диаграмм, созданных с помощьюchart.js, каждые 30 секунд. Все это работает нормально.
Однако, когда пользователь делает выбор и график меняется, мне нужно немедленно отправить новые данные. Итак, я пытаюсь сделать запрос: клиент отправляет запрос на сервер через веб-сокет, затем сервер получает указанный запрос и отправляет данные обратно клиенту.
Моя проблема: , что вебсокет не получает никаких данных от клиента, хотя вроде бы все в порядке. Я неправильно понимаю, как следует использовать функции? Любая помощь будет оценена по достоинству!
Ни в журнале, ни в консоли нет ошибок ни на стороне сервера, ни на стороне клиента.
См. код для мой AsyncWebsocketConsumer:

Код: Выделить всё

from asyncio import sleep
from channels.generic.websocket import AsyncWebsocketConsumer
from func.web_read import DatasetBuilder
from datetime import datetime, timedelta, timezone

class ChartDraw(AsyncWebsocketConsumer):

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._dataset: str
self._hash_dataset: hash
self._allmeasurements: DatasetBuilder

async def connect(self):
await self.accept()

self._allmeasurements = DatasetBuilder(1) # some magic, building a dataset

self._date_end: datetime = datetime.now(timezone(timedelta(hours=+1)))
self._date_start: datetime = self._date_end - timedelta(minutes=15)
self._dataset = self._allmeasurements.get_relevant_messages(self._date_start, self._date_end) # gets all the data from a db in the given timeframe.
self._hash_dataset = hash(str(self._dataset))
await self.send(str(self._dataset))

await self.updateDataIfChanged()

async def updateDataIfChanged(self):
while True:
self.updateDate()
self._dataset = self._allmeasurements.get_relevant_messages(self._date_start, self._date_end)
if self._hash_dataset != hash(str(self._dataset)):
await self.send(str(self._dataset))
self._hash_dataset = hash(str(self._dataset))
await sleep(30)
print("30s passed.")

async def receive(self, text_data):
print("New Message!")
print(text_data)
И в javascript это соответствующие части:

Код: Выделить всё

const socket = new WebSocket('ws://localhost:8000/ws/draw_chart/');

console.log("sending to websocket ...");
try {
socket.send("DO YOU HEAR ME!?");
} catch (error) {
console.error("Received error sending data to websocket:", error)
}
Кажется, по этому поводу очень мало полезной документации. Я пытался использовать async.gather для параллельного выполнения получения и моей функции "updateDataIfChanged", но безрезультатно.
Поскольку я затем понял, что получение все равно выполняется параллельно и прослушивает сообщения, я отменил его. назад. Разве он не должен выводить полученный текст сразу после его получения?

Подробнее здесь: https://stackoverflow.com/questions/792 ... g-channels
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»