Django视图中的长时间操作导致超时。Python有办法使用AJAX吗?

6 投票
3 回答
4006 浏览
提问于 2025-04-15 15:08

我已经编程Python有一段时间了,但DJango和网页编程对我来说还是新鲜事。

我在一个Python视图中有一个非常耗时的操作。因为这个视图里的local()函数返回的时间太长,导致出现了HTTP超时。这一点我明白。

那么,有什么好的方法可以立即给用户一个HTTP响应,然后在页面上动态显示一些Python代码的结果呢?我觉得答案可能跟AJAX有关,但我不太确定客户端的AJAX怎么能从服务器上的Python获取数据,或者通常用哪些模块来实现这个功能。

3 个回答

1

我不确定这是不是你想要的,但也许这个问题(如何在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>
6

一种方法是使用AJAX/JS或者普通方式提交任务,先在后台启动它,然后立即返回结果。接着,客户端可以用AJAX/JS定期检查任务是否完成。如果完成了,就刷新页面或者给客户端提供一个链接。

客户端:“请用这些数据开始一个任务。” -> 服务器

客户端 <- “任务已开始!” 服务器

客户端:“完成了吗?” -> 服务器

客户端 <- “还没。” 服务器

客户端:“完成了吗?” -> 服务器

客户端 <- “完成了,这里有个链接可以查看结果。” 服务器

虽然可以在服务器主动发送数据给客户端,而不需要客户端请求(这种技术叫做Comet),但在你的情况下其实并不必要。

7

Ajax不需要服务器端使用任何特定的技术。你只需要返回一种客户端的JavaScript能够理解的响应格式。这里推荐使用JSON,因为在Python中生成JSON非常简单(Python 2.6有一个json库,Django也有django.utils.simplejson供其他版本使用)。

所以,你只需要把你的数据转换成JSON格式,然后像发送其他响应一样发送它——也就是说,把它放在一个HTTPResponse里面。

撰写回答