尝试 运行 后台任务,同时更新 django 中的视图

Trying to run background task while simultaneously updating the view in django

我正在从事一个分析实时数据并将其绘制在每 10 秒更新一次的图表中的项目。

我一直在尝试为这个小程序制作一个 django 网络应用程序,但我不确定如何:

  1. 运行 后台任务,持续分析数据。
  2. 每隔 10 秒,将此新数据推送到视图中。或者在视图中呈现此数据,而不会破坏需要连续分析的功能。

我可以调查什么? 谢谢。

编辑:拼写

您应该重新考虑数据的访问方式。

首先,您的数据应该存储在安全的地方。例如,一个数据库(Sqlite 是默认的并且非常简单)。创建一个模型,然后让您的后台任务根据需要更新数据库。

除了您的默认 URI 外,还有第二个 URi,其中 returns 数据采用 JSON 形式(django.http 中的 JsonResponse 对此非常有用)。这样,客户端可以查询此地址并获得 JSON 数据作为响应。

其次,有一个 JavaScript 脚本 运行 异步调用上面的 URI 并根据需要更新屏幕上的元素。

这样用户就可以停留在页面上并进行更新,而无需每 10 秒重绘整个页面。

请注意,代码并不完整,但为了提供基本概念,您不应按原样使用它(它很可能会失败)

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)

在index.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 秒调用一次

@Mandemon 回答解决了问题,但这不是以这种方式解决的好习惯。

如果可用的新数据服务器会自动发送到您更新视图的用户视图(Web 浏览器),您可以在项目中使用 Web 套接字 (HTML)。 一次又一次地向服务器发出请求这不是一个好主意。


您可以使用 Django Channels 实现网络套接字。 现在您可以看到实时数据提要。


进一步阅读:

What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?