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

Python 如何实时显示Django 1.4网站的脚本结果?,python,django,django-1.4,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').r

因此,在了解了如何在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})
然而,这并没有给我实时数据,只是刷新网页时的最新记录


我想要的是能够实时监控性能。我想我以前见过这样的情况:你可以浏览一个静态文件,然后假装它是live for demos,但这不是我所需要的。

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


你也可以看看。它允许执行外部进程。

可能从您的
导入
与再次导入无关

来自django.shortcuts的
呈现

试试这个:

从django.shortcuts导入渲染

第一种方法不起作用,因为需要使用django 1.5中首次添加的方法

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

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

  • 一个视图提供包含一些javascript的静态页面
  • javascript发出AJAX请求(比如说每秒一次),从第二个视图获取更新的数据,并将其显示在页面上
  • 如果您希望它超过每秒一次,最好的解决方案是使用websocket—因此您需要一些javascript来打开websocket连接以获取新数据。这通常不适用于Django,但可以使用以下内容使其工作-请参阅

    另一个解决办法是——他们有一个共同的目标。这使用了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>
    
    这是在fanout上使用我的测试域。它实际上会像发帖时一样工作,但在正常情况下,你需要替换你自己的密钥/领域等。根本不需要使用Django——它没有帮助

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

    data = file("measurements.txt").read()
    fanout.publish("test", data)
    
    要从系统命令(如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文件。

    为什么不将数据放入数据库?@zoosuck如果我将数据放入数据库,每秒添加一次测量值,会不会导致数据量过大?如果该网页位于数据库中,它是否能够显示实时结果?如果是这样的话,最好的方式是什么?“大规模”是相对的。使用Django显示数据库中的数据对于Stack来说不是一个合适的主题,因为它在优秀的教程中有很好的介绍。我没有问过如何显示数据库中的数据,我问过如何使用Django 1.4在网页上显示实时数据。抱歉,这是一个打字错误!我尝试subprocess.popen执行该命令,但它只是在运行Django本地服务器的终端上打印出结果。我调查了Spundmagon,但我不确定它是否支持Django 1.4,我给开发人员发了电子邮件,希望他能够弄清楚它是否支持Django 1.4。我从未听说过fanout.io,你知道它是否适用于1.4吗?1)你有没有理由坚持使用1.4?它现在已经很老了,扇形输出应该独立于服务器端技术工作。事实上,您可以使用一个简单的Python脚本来支持它-您根本不需要Django我将发布一个完整的示例脚本为了能够访问我正在使用的SAP HANA数据库,我必须使用Django 1.4,据我所知,没有支持的方法可以使用更新的版本访问数据库。@MOS182-好的,但实际上Django只是一种干扰。您根本不需要使用它来流式传输数据。我发布的使用fanout的简单Python脚本就足够了。听起来您正在使用Django访问SAP HANA db,但手头的任务并不需要它。所以Django根本不参与其中——没有必要涉及它。有趣的解决方法,我怀疑可能有更强大的方法来实现这一点,我正在查找。干得好
    import subprocess
    data = subprocess.check_output(["procinfo"])
    
    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); 
    
    }