Я создал веб-сервер, используя каналы 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)
Код: Выделить всё
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)
}
Поскольку я затем понял, что получение все равно выполняется параллельно и прослушивает сообщения, я отменил его. назад. Разве он не должен выводить полученный текст сразу после его получения?
Подробнее здесь: https://stackoverflow.com/questions/792 ... g-channels
Мобильная версия