如何实时显示 Django 1.4 网站的脚本结果?

How can you display the results of a script in real-time for a Django 1.4 website?

所以在发现如何在 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})

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

我想要的是能够实时监控性能。我想我以前见过你可以浏览静态文件并假装它是现场演示,但这不是我需要的。

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

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

也许您的 import 与您再次输入的内容无关。

from django.shortcuts render

试试这个:
from django.shortcuts import render

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

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

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

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

如果你想要它超过每秒,最好的解决方案是使用 WebSockets - 所以你会有一些 javascript 打开 websocket 连接来获取新数据。这通常不适用于 Django,但可以使用 fanout.io - see the blog post.

之类的东西使其工作

另一种解决方案是swampdragon - they have a 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)

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

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

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

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

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

在做了一些研究并询问了我认识的做过类似任务的人之后,我被推荐使用 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 文件发送数据。每当我想获得实时结果时,我都可以使用 sar 脚本将 %system 数据发送到 %system.txt 文件。