Попытка запустить фоновую задачу при одновременном обновлении представления в django - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над проектом, анализирующим данные в реальном времени и отображаю их в виде графика, который обновляется каждые 10 секунд.

Я пытался создать django веб-приложение этой маленькой программы, но Я не знаю, как:

  1. Запускать фоновую задачу, непрерывно анализируя данные.
  2. Каждые 10 секунд pu sh эти новые данные помещаются в представление. Или отобразите эти данные в представлении, не нарушая функцию, которая должна постоянно анализировать.

На что я мог смотреть? Спасибо.

Изменить: орфография

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

@ Mandemon answer решает проблему, но это не лучший способ решения этой проблемы.

Вы можете использовать веб-сокеты в своем проекте, если новые доступные данные сервер будут автоматически отправлять в пользовательское представление (веб-браузер), где вы обновляете свое представление (HTML). Делать запросы снова и снова к серверу - не лучшая идея.


Вы можете реализовать веб-сокеты, используя Django каналы . Теперь вы можете видеть поток данных в реальном времени.


Дополнительная литература:

Что такое длительный опрос, веб-сокеты, события, отправленные сервером (SSE ) и Комета?

0 голосов
/ 27 мая 2020

Вам следует переосмыслить, как осуществляется доступ к данным.

Во-первых, ваши данные должны храниться в безопасном месте. Например, база данных (по умолчанию Sqlite довольно прост). Создайте модель, а затем просто пусть ваша фоновая задача обновит базу данных по мере необходимости. очень полезно для этого). Таким образом, клиент может запросить этот адрес и получить в ответ данные JSON.

Во-вторых, асинхронно запустить сценарий JavaScript для вызова указанного выше URI и обновления элементов на экране по мере необходимости.

Таким образом, пользователь может оставаться на странице и обновлять ее без необходимости перерисовывать всю страницу каждые 10 секунд.

Обратите внимание, что код не завершен, но чтобы дать основную идею c, вам следует не использовать его как есть (скорее всего, он потерпит неудачу)

views.py

from django.shortcuts import render
from django.http import JsonResponse
from django.forms.models import model_to_dict

def index(request):
  return render(request, "index.html")

def data(request):

  query = DataPoints.objects.all()
  datapoints= []
  for datapoint in query:
       datapoints.append(model_to_dict(datapoint ))
  data = {
        'datapoints' : datapoints
  }
  return JsonResponse(data, safe=False)

В индексе. html, иметь скрипт

function fetch_data() {
  fetch('youraddress.com/data') //Fetch data from the address
  .then(response => response.json()) //get the JSON section from the response
  .then( updatePage(data) ); //Here you do whatever you need to update then page with the data
  .then(setTimeout(fetch_data(), 10000)); //Finally, set timeout for 10 seconds and call function again
}

Теперь вам нужно вызвать fetch_data только один раз после загрузки страницы, и он будет каждые 10 секунд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...