如何检测Django中的中止连接?

时间:2011-05-16 14:49:34

标签: django apache http wsgi

我有一个Django视图,它做了一些非常繁重的处理,大约需要20-30秒才能返回结果。

有时用户最终会在请求完成之前关闭浏览器窗口(终止连接) - 在这种情况下,我希望能够检测到这一点并停止工作。我所做的工作在数据库上是只读的,因此交易没有任何问题。

在PHP中,connection_aborted函数就是这样做的。这个功能在Django中可用吗?

以下是我想写的示例代码:

def myview(request):
    while not connection_aborted():
        # do another bit of work...
        if work_complete:
            return HttpResponse('results go here')

感谢。

3 个答案:

答案 0 :(得分:1)

我不认为Django提供它,因为它基本上不能。不仅仅是Django本身,这取决于Django与您的Web服务器的接口方式。所有这些都取决于您的软件堆栈(您尚未指定)。我认为它甚至不是FastCGI和WSGI协议的一部分!

编辑:我也非常确定Django在您的视图完成执行之前没有开始向客户端发送任何数据,所以它无法知道是否连接已经死了。除非服务器尝试将一些数据发送回用户,否则底层套接字不会触发错误。

答案 1 :(得分:0)

PHP中的connection_aborted方法没有按照您的想法执行。它将告诉您客户端是否仅在刷新缓冲区时断开,即从服务器向客户端发送某种响应。 PHP版本甚至不会像你上面写的那样工作。您必须在循环中添加flush之类的调用,以使服务器尝试发送数据。

HTTP是无状态协议。 设计以使客户端或服务器不相互依赖。因此,只有在创建了连接时才知道任一状态,并且只有当某些数据以某种方式发送时才会出现。

你最好的选择是像@MattH建议的那样做,并通过一些AJAX来做这件事,如果你愿意,你可以集成Node.js这样的东西,让客户在处理过程中“签到”。不过,如何正确设置这一点超出了我的专业领域。

答案 2 :(得分:-1)

所以你有一个AJAX视图,它运行一个查询,在渲染页面的后台处理所需的处理时间为20-30秒,你担心当有人取消页面加载时会浪费资源。

我看到你有三大类可供选择:

  1. 和它一起生活。通过缓存结果来改善情况,以防用户回来。
  2. 加快速度。在时间/空间权衡中投入更多空间。维护中间表。预先计算整个事物等。
  3. 用浏览器做一些聪明的事情快速调查“它准备好了吗?”查询和服务器取消查询,如果它没有收到间隔* 2或类似内的唠叨。如果你真的很聪明,你可以将进度/ ETA归还给唠叨。但是,当系统负载不足或您的站点通过有限的带宽访问时,这可能没有特别有用的行为。
  4. 我认为你不应该选择选项3,因为它增加了复杂性和资源使用而没有太大的收获。