让我们说服务器上的操作可能需要2到10分钟来执行,例如更新耗时的索引。
您是否会在持有请求时执行操作?即在操作完成之前不发送HTTP响应?如果客户端/浏览器丢弃请求,请继续执行操作?
有什么替代方案?启动操作,并通过“长时间操作开始”响应?如果操作在中途失败怎么办?客户知道怎么办?保持操作的服务器端“状态”?
由于
答案 0 :(得分:3)
您也可以使用分块响应。首先,使用一些显示“请稍候”屏幕的代码推送一个块,刷新响应并开始工作。然后,您可以通过定期进度更新来推送和刷新块,或者只使用“已完成”信息在最后推送一个块。显然,你可以使用JavaScript来获得一个漂亮的用户界面。
(如果您正在使用WSGI,则上述情况不适用,因为第一个WSGI规范是以阻止使用未知长度响应的方式编写的,因此使用分块响应是不可能的。)
答案 1 :(得分:2)
对于您知道需要花费很长时间(超过几秒钟)处理的请求,您必须至少假设防火墙强行切断连接。
我会说你应该在后端实现一个队列系统。 执行操作的请求将成为对队列操作的请求。当操作实际完成时,您可以等待客户端轮询,或以某种方式主动通知它们。对于浏览器,您几乎不得不轮询或发送电子邮件。
答案 2 :(得分:0)
您是否会在持有请求时执行操作?即在操作完成之前不发送HTTP响应?
您的用户期望什么?
如果客户端/浏览器丢弃了请求,那么还是继续操作吗?
您的用户期望什么?
有什么替代方案? 启动操作,并通过“长时间操作开始”响应?
你还能做什么?忽略请求?假装它没有发生?显然,你告诉他们。
如果操作在中途失败怎么办?客户知道怎么办? 保持操作的服务器端“状态”?
有什么替代方案?魔法?直觉?显然,你必须保留身份。并显示状态。
阅读celery。