如何实时显示 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' - 您实际上需要每秒查看多少次更新?您可能会占用大量资源来持续提供此数据。
假设用户不是太多,并且每秒更新一次,一种解决方案是使用轮询。您有两个视图函数:
- 一个视图提供一个包含一些 javascript
的静态页面
- 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>
中查看
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 文件。
所以在发现如何在 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' - 您实际上需要每秒查看多少次更新?您可能会占用大量资源来持续提供此数据。
假设用户不是太多,并且每秒更新一次,一种解决方案是使用轮询。您有两个视图函数:
- 一个视图提供一个包含一些 javascript 的静态页面
- 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>
中查看
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 文件。