Django视图中的长时间操作导致超时。Python有办法使用AJAX吗?
我已经编程Python有一段时间了,但DJango和网页编程对我来说还是新鲜事。
我在一个Python视图中有一个非常耗时的操作。因为这个视图里的local()函数返回的时间太长,导致出现了HTTP超时。这一点我明白。
那么,有什么好的方法可以立即给用户一个HTTP响应,然后在页面上动态显示一些Python代码的结果呢?我觉得答案可能跟AJAX有关,但我不太确定客户端的AJAX怎么能从服务器上的Python获取数据,或者通常用哪些模块来实现这个功能。
3 个回答
我不确定这是不是你想要的,但也许这个问题(如何在Python中实现一个最简单的AJAX服务器?)会对你有帮助。在我的回答中,我给出了一个简单的例子(虽然写得不是很好,比如现在我会用jquery...)。
编辑:根据提问者的要求,这里有一个使用JQuery的前端示例。请注意,我不是这方面的专家,所以可能会有问题。这个例子应该可以和一个JSON-RPC后端一起使用,比如这个。
<html>
<head>
<title>JSON-RPC test</title>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript">
function test_button() {
var data = $("[name=test_text]").val();
var json_object = {"method": "power",
"params": [parseInt(data), 3],
"id": "test_button"};
var json_string = JSON.stringify(json_object);
$.post("frontend.html", json_string, test_callback, "json")
}
function test_callback(json_object) {
$("#test_result").text(json_object.result.toString());
}
</script>
</head>
<body>
<input type="text" name="test_text" value="2" size="4">
** 3 =
<span id="test_result">0</span>
<input type=button onClick="test_button();" value="calc" title="calculate value">
</body>
</html>
一种方法是使用AJAX/JS或者普通方式提交任务,先在后台启动它,然后立即返回结果。接着,客户端可以用AJAX/JS定期检查任务是否完成。如果完成了,就刷新页面或者给客户端提供一个链接。
客户端:“请用这些数据开始一个任务。” -> 服务器
客户端 <- “任务已开始!” 服务器
客户端:“完成了吗?” -> 服务器
客户端 <- “还没。” 服务器
客户端:“完成了吗?” -> 服务器
客户端 <- “完成了,这里有个链接可以查看结果。” 服务器
虽然可以在服务器主动发送数据给客户端,而不需要客户端请求(这种技术叫做Comet),但在你的情况下其实并不必要。
Ajax不需要服务器端使用任何特定的技术。你只需要返回一种客户端的JavaScript能够理解的响应格式。这里推荐使用JSON,因为在Python中生成JSON非常简单(Python 2.6有一个json
库,Django也有django.utils.simplejson
供其他版本使用)。
所以,你只需要把你的数据转换成JSON格式,然后像发送其他响应一样发送它——也就是说,把它放在一个HTTPResponse
里面。