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

时间:2015-01-20 12:09:14

标签: python django django-1.4

因此在找到如何在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})

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

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

4 个答案:

答案 0 :(得分:1)

你的第一种方法不起作用,因为你需要使用最初在Django 1.5中添加的streaming responses

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

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

  1. 一个视图提供包含一些javascript的静态页面
  2. javascript发出一个AJAX请求(比如说每秒)从第二个视图获取更新的数据,并将其显示在页面上。
  3. 如果你想要它超过每秒,最好的解决方案是使用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 - 它没有帮助。

    您可以使用SAR或脚本的输出,而不是使用psutil:

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

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

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

答案 1 :(得分:1)

在做了一些研究并询问我知道谁做过类似任务的人之后,我建议使用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文件。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

也许来自你的import再也不是你的导入了。

from django.shortcuts render

试试这个:
from django.shortcuts import render