#django #vue.js #websocket
Вопрос:
Некоторое время назад на SO был похожий вопрос по этому поводу, хотя я безуспешно пытался найти ответы.
Я внедряю SPA, используя серверную часть Django и интерфейс Vue с интерфейсом Vue cli. Django использует каналы для отправки JSON через веб-сайт на интерфейс, интерфейс получает эти данные и должен обновлять таблицу.
Часть Джанго работает. Соединение с WebSocket подтверждено, и данные получены в Vue, хотя у меня есть две проблемы, которые я не смог найти способ решить:
- Данные, находящиеся в переменной, не отображаются в таблице и
- Интерфейс получает данные только один раз — я не знаю, как применить прослушиватель к WebSocket или в какой части моего приложения Vue, чтобы новые полезные данные (надеюсь, я говорю это правильно) были получены и соответственно обновлены.
Ниже я предоставил Django consumers.py файл, файл представления Signals.vue и консоль.вывод журнала показывает, что переменная действительно содержит объект JSON, несмотря на то, что таблица остается пустой.
У кого-нибудь есть представление о том, где я ошибаюсь и как я могу решить проблемы 1 и 2? Спасибо
Джанго consumers.py
import json from channels.generic.websocket import WebsocketConsumer class WSConsumer(WebsocketConsumer): def connect(self): self.accept() self.send(json.dumps({ 'id': 1, 'date': "date", 'marketOpen': "marketOpen", 'symbol': "symbol", 'trade': "trade", 'bias': "bias", 'status': "status" }))
Сигналы.vue
lt;templategt; lt;div class="container"gt; lt;div class="columns is-multiline"gt; lt;div class="column is-12"gt; lt;h1 class="title"gt; Signalslt;/h1gt; lt;/divgt; lt;div class="column is-12"gt; lt;table class="table is-fullwidth"gt; lt;theadgt; lt;trgt; lt;thgt;Datelt;/thgt; lt;thgt;Market Openlt;/thgt; lt;thgt;Symbollt;/thgt; lt;thgt;Tradelt;/thgt; lt;thgt;Biaslt;/thgt; lt;thgt;Statuslt;/thgt; lt;/trgt; lt;/theadgt; lt;tbodygt; lt;tr v-for= "signal in signals" v-bind:key="signal.id"gt; lt;tdgt;{{ signal.date }} lt;/tdgt; lt;tdgt;{{ signal.marketOpen }} lt;/tdgt; lt;tdgt;{{ signal.symbol }} lt;/tdgt; lt;tdgt;{{ signal.trade }} lt;/tdgt; lt;tdgt;{{ signal.bias }} lt;/tdgt; lt;tdgt;{{ signal.status }} lt;/tdgt; lt;/trgt; lt;/tbodygt; lt;/tablegt; lt;/divgt; lt;/divgt; lt;/divgt; lt;/templategt; lt;scriptgt; export default { name: 'Signals', data() { return { signals: [], connection: null } }, created() { this.getSignals() }, methods: { getSignals() { console.log("Starting connection to websocket") this.connection = new WebSocket('ws://localhost:8000/ws/signals/') this.connection.onmessage = (event) =gt; { this.signals = event.data console.log("Successfully retrieved message from websocket") console.log(this.signals) } } } } lt;/scriptgt;
Приставка
[HMR] Waiting for update signal from WDS... log.js?1afd Starting connection to websocket Signals.vue?1d80 Unchecked runtime.lastError: The message port closed before a response was received. signals:1 Successfully retrieved message from websocket Signals.vue?1d80 {"id": 1, "date": "date", "marketOpen": "marketOpen", "symbol": "symbol", "trade": "trade", "bias": "bias", "status": "status"} Signals.vue?1d80
Комментарии:
1. Ты когда-нибудь заставлял это работать?
2. Да — он был отправлен только один раз, потому что он был единственным потребителем, который запускался только один раз. Я настроил задачи сельдерея и создал задачу, которая будет выполняться каждые x минут/ часов/ дней и т. Д., Это решило проблему.