如何在XHR中止时终止长时间运行的Django请求?

12 投票
2 回答
1708 浏览
提问于 2025-04-18 11:37

我在客户端发起了一个请求,然后我改变主意,调用了 xhr.abort() 来取消这个请求。

那么,Django会怎么反应呢?它会终止处理这个请求的线程吗?如果不会,那我该怎么让Django停止浪费时间去处理这个已经取消的请求呢?我该如何优雅地处理这个情况?

2 个回答

-1

可以把网络看作是一个平台,用来构建简单易用、分布式、松散耦合的系统。就像404状态码所暗示的那样,网络资源的可用性并没有保证。

我觉得,像你提到的那种紧密耦合的解决方案是违背网络原则和REST使用规范的。xhr.abort() 是客户端的编程,它和服务器端的编程完全不同。试图把客户端技术和服务器内部行为紧密结合起来是个坏主意。

不仅这样做浪费资源,而且也无法保证网络服务器对请求的处理状态。这可能还会导致数据不一致。

如果你的请求不会对服务器产生任何影响,客户端也不需要为此负责,那就最好忽略这个请求,因为这种请求不会改变服务器的状态,而且响应通常会被缓存,以提高性能。

如果你的请求可能会导致服务器状态或数据的变化,为了数据的一致性,你可以通过API检查这些变化是否生效。如果发生了影响,可以尝试使用另一个API进行回滚。

1

因为HTTP的工作方式,以及通常在你的Django应用程序前面会有一个前端(比如nginx),所以你的HTTP取消请求会被nginx缓存。Gunicorn(一个处理请求的工具)并不会收到任何信号,它只是继续处理请求,然后把结果输出到HTTP连接上。但是如果这个连接已经关闭了,就会出现错误(这个错误会被当作连接关闭来处理,然后继续进行)。

所以,如果你能找到方法发起很多这样的请求,就很容易让服务器瘫痪。

至于你的问题,这取决于后端的设置,使用Gunicorn的话,它会一直处理请求,直到超时为止。

撰写回答