如何在Django中检测连接中断?

nit*_*wit 5 apache django wsgi http

我有一个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')
Run Code Online (Sandbox Code Playgroud)

谢谢。

Chr*_*att 0

PHP 中的该connection_aborted方法并不执行您想象的操作。它会告诉您客户端是否已断开连接,但前提是缓冲区已被刷新,即某种响应从服务器发送回客户端。PHP 版本甚至无法像上面所写的那样工作。您必须flush在循环中添加对类似内容的调用,以使服务器尝试发送数据。

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

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

  • HTTP 在 HTTP 请求之间是无状态的。连接本身显然具有(可能是隐式的)状态,例如“服务器从客户端接收了多少字节。 (3认同)