我有一个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')
感谢。
答案 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秒,你担心当有人取消页面加载时会浪费资源。
我看到你有三大类可供选择:
我认为你不应该选择选项3,因为它增加了复杂性和资源使用而没有太大的收获。