【问题标题】:How can you display the results of a script in real-time for a Django 1.4 website?如何为 Django 1.4 网站实时显示脚本的结果?
【发布时间】:2015-01-20 12:09:14
【问题描述】:

因此,在了解了如何在 Django 网站上显示脚本的结果后,我认为我可以使用 SAR 显示实时 CPU 信息之类的内容,但是每当我更改代码并刷新网页时,它都不会加载并不断看起来像是在尝试加载网页。

到目前为止,我唯一能做的就是在终端中运行 SAR 命令,将结果解析为文本文件,然后使用

打印出文本文件
import os

from django.shortcuts import render


def dashboard(request):

    output = os.popen('cat measurements.txt').read()
    return render(request,'dashboard/geckoboard.html', {'output': output})

但这并没有给我实时数据,只是刷新网页时的最新记录。

我想要的是能够实时监控性能。我想我过去曾见过你可以浏览一个静态文件并假装它是用于演示的,但这不是我需要的。

【问题讨论】:

  • 为什么不将数据放入数据库?
  • @zoosuck 如果我将数据放入数据库中,通过每秒添加测量值会不会导致它很快变得庞大?如果网页在数据库中,是否能够显示实时结果?如果是这样,最好的方法是什么?
  • “大量”是相对的。使用 Django 显示数据库中的数据不是 Stack 的合适主题,因为它在优秀教程中得到了很好的介绍。
  • 我没有问过如何显示数据库中的数据,我已经问过如何使用 Django 1.4 在网页上显示实时数据的建议

标签: python django django-1.4


【解决方案1】:

您的第一种方法行不通,因为您需要使用 Django 1.5 中首次添加的 streaming responses

一个合适的解决方案需要某种长时间运行的连接来传输数据。在执行此操作之前,您需要考虑资源以及您打算支持多少用户。您还需要更明确地定义“实时”——您实际上需要查看每秒多少次更新?您可能会占用大量资源来持续提供这些数据。

假设没有太多用户,并且每秒更新一次,一种解决方案是使用轮询。你有两个视图函数:

  1. 一个视图提供一个包含一些 javascript 的静态页面
  2. javascript 发出 AJAX 请求(例如每秒)以从第二个视图获取更新的数据,并将其显示在页面上。

如果您比每秒都想要它,最好的解决方案是使用 WebSockets - 因此您需要一些 javascript 来打开 websocket 连接以获取新数据。这通常不适用于 Django,但可以使用 fanout.io 之类的东西进行工作 - 请参阅 blog post

另一个解决方案是swampdragon - 他们有一个tutorial for building a CPU monitor。这使用了 Tornado,一种更适合实时应用程序的 Python 服务器。


一个使用扇出的简单例子:

网页:

<script src="http://pubsub.fanout.io/static/faye-browser-min.js"></script>
<div id="output"></div>

<script>
var client = new Faye.Client('http://pubsub.fanout.io/r/59f4bc8c/bayeux');
client.subscribe('/test', function (data) {
    $('#output').text(data);
});
</script>

查看jsfiddle

Python 脚本 - 只需在您的服务器上运行:

#!/usr/bin/env python

# pip install psutil
# pip install fanout

import fanout
import psutil
import time

fanout.realm = '59f4bc8c'
fanout.key = '81gUakHNM/Y7+1V0BkmErw=='

while True:
    fanout.publish('test', 'CPU percent: {0}%'.format(psutil.cpu_percent()))
    time.sleep(1)

这是在扇出上使用我的测试领域。它实际上会在发布时正常工作,但在正常情况下您需要替换自己的密钥/领域等。根本不需要使用 Django - 它没有帮助。

除了使用 psutil,您当然可以使用 SAR 或脚本的输出:

data = file("measurements.txt").read()
fanout.publish("test", data)

要从系统命令(例如 procinfo)获取数据,请使用:

import subprocess
data = subprocess.check_output(["procinfo"])

【讨论】:

  • 我研究了 SwampDragon 但我不确定它是否支持 Django 1.4,给开发人员发了电子邮件希望他能够澄清是否支持。我从来没有听说过 fanout.io,你知道它是否适用于 1.4 吗?
  • 1) 你有理由坚持使用 1.4 吗?它现在已经很老了 2)扇出应该独立于您的服务器端技术工作。事实上,你可以使用一个简单的 Python 脚本来驱动它——你根本不需要 Django。 fanout.io/docs/devguide.html#introduction - 我会发布一个完整的示例脚本
  • 为了能够访问我正在使用的 SAP HANA 数据库,我必须拥有 Django 1.4,没有支持使用更新版本访问数据库的方法(据我所知)。
  • @MOS182 - 好的,但实际上 Django 在这里只是分散注意力。您根本不需要使用它来传输数据。我发布的使用扇出的简单 Python 脚本就足够了。听起来您正在使用 Django 访问 SAP HANA 数据库,但手头的任务不需要它。所以 Django 根本不参与其中——没有必要参与其中。
【解决方案2】:

在做了一些研究并询问了我认识的做过类似任务的人之后,我被推荐使用 AJAX 来解决这个问题。这是我使用的代码。

function cpu_system() {

  var xmlhttp;

  if (window.XMLHttpRequest)

    {// code for IE7+, Firefox, Chrome, Opera, Safari

    xmlhttp=new XMLHttpRequest();

    }

  else

    {// code for IE6, IE5

    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    }

  xmlhttp.onreadystatechange=function()

    {

    if (xmlhttp.readyState==4 && xmlhttp.status==200)

      {

      document.getElementById("cpu-system").innerHTML=xmlhttp.responseText;

      }

    }


  setInterval(function() {

    xmlhttp.open("POST","/static/stats/%system.txt",true);

        xmlhttp.send();

  }, 5000); 

}

所以在这个函数中,我每 5 秒从我的 %system.txt 文件中发送一次数据。每当我想获得实时结果时,我只需要一个将 %system 数据发送到 %system.txt 文件的 sar 脚本。

【讨论】:

  • 有趣的解决方法,我怀疑可能有更强大的方法可以做到这一点,我正在查找。干得好。
【解决方案3】:

如果您将 SAR 数据解析到数据库中以便在您的视图中轻松查询,这听起来会更轻松。

您还可以查看the subprocess module in Python。它允许执行外部进程。

【讨论】:

  • 我尝试 subprocess.popen 来执行命令,但它只是在运行 Django 本地服务器的终端中打印出结果。
【解决方案4】:

也许来自您的import 不是您再次导入的内容。

from django.shortcuts render

试试这个:
from django.shortcuts import render

【讨论】:

  • 抱歉打错了!
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2013-12-31
  • 2018-03-29
  • 2013-03-18
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多