Python 如果XHR得到abort(),如何终止长时间运行的Django请求?

Python 如果XHR得到abort(),如何终止长时间运行的Django请求?,python,ajax,django,Python,Ajax,Django,我在客户端启动一个请求,然后改变主意,调用xhr.abort() Django对此有何反应?它会以某种方式终止线程吗?如果没有,我如何让Django停止浪费时间尝试响应中止的请求?我该如何优雅地处理它呢?只要把Web想象成一个平台,用于构建易于使用的、分布式的、松散耦合的系统,而不保证404状态代码所建议的资源的可用性 我认为,像您的想法那样创建紧密耦合的解决方案违背了web原则和REST的使用xhr.abort()是客户端编程,它与服务器端完全不同。试图将客户端技术收紧到服务器端内部行为是一种

我在客户端启动一个请求,然后改变主意,调用
xhr.abort()


Django对此有何反应?它会以某种方式终止线程吗?如果没有,我如何让Django停止浪费时间尝试响应中止的请求?我该如何优雅地处理它呢?

只要把Web想象成一个平台,用于构建易于使用的、分布式的、松散耦合的系统,而不保证404状态代码所建议的资源的可用性

我认为,像您的想法那样创建紧密耦合的解决方案违背了web原则和REST的使用
xhr.abort()
是客户端编程,它与服务器端完全不同。试图将客户端技术收紧到服务器端内部行为是一种糟糕的做法

这不仅浪费了资源,而且不能保证web服务器对请求的处理状态。这也可能导致数据不一致

如果您的请求没有产生客户端需要的服务器端副作用 可以追究责任。最好忽略它,因为这类请求不会更改服务器状态&响应通常被缓存以获得更好的性能


如果您的请求可能导致服务器状态或数据发生更改,为了数据一致性,您可以使用API检查更改是否生效。如果受到影响,请尝试使用另一个API回滚。

由于http的工作方式以及您通常在django gunicorn应用程序进程(或uswgi等)前面有一个前端,您的http取消请求由nginx缓冲。gunicorns没有收到信号,它们只是完成处理,然后将任何内容输出到http套接字。但如果该套接字关闭,它将有一个错误(被捕获为关闭的连接并移动一个)

因此,如果你能找到一种方法来产生许多这样的请求,那么对服务器进行DOS是很容易的


但要回答您的问题,这取决于后端,使用gunicorn,它将一直运行到超时。

调用
.abort()
时,服务器通常会继续处理请求,并将其发送,但客户端只会忽略响应。我从来没有考虑过会发生什么,或者Django是否可以中止它自己的进程,但我不这么认为。我认为这样浪费服务器资源是一种耻辱……这取决于浏览器。如果浏览器关闭连接,服务器应终止线程。