jquery - 在 Django 中通过 Ajax 输出日志文件

标签 jquery python ajax django

我遵循了 SO 接受的关于如何从 here 的/var/log/gateway 中读取 Django 中的日志文件的答案我设法像这里一样在终端上输出文件。

2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T12:57:44.160246+08:00 localhost gateway[5205]: System start complete.
2013-05-09T15:13:47.428553+08:00 localhost gateway[4777]: * Unable to connect to device /home/smartsensor1. Device may be offline. *

下一步是,我想输出日志文件并以 html 格式显示,我是这样对原始代码稍作修改的。

def Logs(request):
    with open('../../../../../var/log/gateway') as f:
        while True:
            line = f.readline()
            if line:
                print line
                return HttpResponse(line)

所以在客户端,我根据另一个 SO 接受的答案 here 像这样放置 Ajax .

$.ajax({
    type: "GET", 
    url : "{% url WebServiceApp.logging.Logs %}",
    success: function (data) {
            $("#output").append(data);
            setTimeout("doUpdate()", 2000);
    }
});
}

setTimeout("doUpdate()", 2000);

有了这个,Ajax 的输出数据继续显示日志文件的第一行。在这种情况下,是这样的

2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...
2013-05-09T11:15:02.539091+08:00 localhost gateway[5205]: System starting up...

我知道发生这种情况是因为每次 ajax 访问服务器时,服务器都会做它需要做的事情并发回输出,这是日志文件的第一行,并通过 HttpResponse 输出并完成循环,但它从未得到有机会做另一条线,因为它已经完成了。当另一个查询完成时,它会一次又一次地做同样的事情。

所以可能的解决方案是客户端向服务器询问一次,服务器保持逐行输出日志文件并将其发送给客户端。我不确定这是否可能,所以我在这里询问任何专家如何实现我可以逐行输出日志文件的结果/

最佳答案

好吧,你可以使用这样的想法:

使用 GET 参数,您可以像这样控制 View 的方法:

def Logs(request):
    whole_file = True
    if request.GET.get('whole_file') == 0:
        whole_file = False
    return_string = ''
    with open('../../../../../var/log/gateway') as f:
        while True:
            line = f.readline()
            if line:
                return_string += line + '<br>' # <br> is for breakline html, do it your way
                if not whole_file: break # break if you only need first line
    return HttpResponse(line)

这样,您在 get 参数中包含一个变量,告诉您的 View 是返回整个日志文件(第一次)还是仅返回第一行(下一次)。

然后在您的 ajax 中,您必须包含一种将 GET 参数插入 url 的方法。你使用了 {{url}} 标签,我不太确定如何使用它,但我相信你会在文档中找到一些东西,如果你不能那么试试一些其他方法,如静态字符串(不是很漂亮)或为其创建您自己的自定义标签。

这将是您可能的 javascript 的示例:

$.ajax({
    type: "GET", 
    url : "/ajax_log/?whole_file=0", //this will request the whole file
    success: function (data) {
            $("#output").append(data);
            setTimeout("doUpdate()", 2000);
    }
});
}

setTimeout("doNextUpdate()", 2000);

function doNextUpdate(){

    $.ajax({
        type: "GET", 
        url : "/ajax_log/?whole_file=1", //this will request the just the first line            success: function (data) {
                $("#output").append(data);
                setTimeout("doUpdate()", 2000);
        }
    });
    }
}

这是我的想法来完成你想要的。希望对您有所帮助。

关于jquery - 在 Django 中通过 Ajax 输出日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473463/

相关文章:

javascript - 实现 Ajax/Jquery

Python在迭代时从列表中删除

javascript - XML jQuery 获取多个同名节点

javascript - 如何将字体系列强制级联到 <td> 标签内的按钮元素

javascript - 无法从 UL LI 列表中删除所选类别

javascript - iFrame 验证

python - 在 csv 文件中单独读取列名

python - 在 Python 中调试期间绘制函数

php - jquery:可以使用 serialize() 创建带有嵌套数组的 GET 字符串吗?

ruby-on-rails - 处理来自远程真 Rails 的响应时出错