Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中检测中止的连接?_Django_Apache_Http_Wsgi - Fatal编程技术网

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

如何在Django中检测中止的连接?,django,apache,http,wsgi,Django,Apache,Http,Wsgi,我有一个Django视图,它进行了一些相当繁重的处理,返回结果大约需要20-30秒 有时,用户会在请求完成之前关闭浏览器窗口(终止连接)——在这种情况下,我希望能够检测到这一点并停止工作。我所做的工作在数据库上是只读的,因此事务没有任何问题 在PHP中,函数正是这样做的。这个功能在Django中可用吗 下面是我想编写的示例代码: def myview(request): while not connection_aborted(): # do another bit of

我有一个Django视图,它进行了一些相当繁重的处理,返回结果大约需要20-30秒

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

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

下面是我想编写的示例代码:

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

谢谢。

PHP中的
连接\u被中止的
方法并不像您认为的那样。它将告诉您客户端是否已断开连接,但前提是缓冲区已刷新,即某种响应从服务器发送回客户端。如果出现上述情况,PHP版本甚至不会像您编写的那样工作。您必须在循环中添加一个类似于
flush
的调用,以便服务器尝试发送数据

HTTP是一种无状态协议。它的设计目的是使客户机和服务器都不相互依赖。因此,只有在创建连接时才知道其中一个的状态,并且只有在存在某种数据要以某种方式发送时才会发生这种情况


您最好按照@MattH的建议去做,并通过一点AJAX来完成,如果您愿意,您可以集成Node.js之类的东西,使客户端在处理过程中“签入”。但是,如何正确设置它超出了我的专业范围。

因此,您有一个AJAX视图,它在呈现页面的后台运行一个查询,需要20-30秒来处理请求,并且您担心当有人取消页面加载时会浪费资源

我发现您有三大类选择:

  • 接受它。通过缓存结果来改善这种情况,以防用户回来
  • 快一点。在时间/空间的权衡中投入更多的空间。维护中间表。预先计算整个事情等
  • 使用浏览器快速轮询“准备好了吗?”查询,如果在间隔*2或类似时间内没有收到nag,服务器将取消查询。如果你真的很聪明,你可以把进度/预计到达时间还给那些唠叨的人。但是,当系统负载不足或您的站点在有限带宽上被访问时,这可能没有特别有用的行为

  • 我认为您不应该选择选项3,因为它增加了复杂性和资源使用率,但没有多大收益。

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


    编辑:我还非常确定,在视图完成执行之前,Django不会开始向客户端发送任何数据,因此它不可能知道连接是否已断开。除非服务器尝试将一些数据发送回用户,否则底层套接字不会触发错误。

    人们往往不能容忍长时间的空白屏幕等待。我建议您返回一个页面,该页面将使用AJAX(可能是使用进度微调器)呈现请求这项繁重任务……我完全同意——实际上,在呈现进度微调器时,AJAX会调用此视图,并显示一条消息,说明用户可能需要一段时间。@MattH:但这并不能解决OP的问题。即使它是通过AJAX实现的,用户也可以移动到另一个URL并中止连接,然后OP仍然需要检测它。@André,这就是为什么它是一个注释/建议,而不是一个“解决方案”。HTTP在HTTP请求之间是无状态的。连接本身显然具有(可能是隐式的)状态,例如服务器从客户端接收的字节数。连接可能会在请求之间存储一些数据,但这并不重要。使用您的示例,从客户机接收的字节不会更改,除非服务器和客户机之间打开一些通信。如果客户端正在等待服务器响应(不发送数据),而服务器正在处理请求(不发送数据),则连接没有状态。