如何在发出Django Rest api请求时更新进度条?
我的django rest应用程序接受从多个页面中获取价格的请求,并对它们进行比较(这需要5秒钟),然后将每个页面的价格列表作为json对象返回。 我想用当前操作更新用户,例如,如果我刮取3个页面,我想如下更新界面: 搜索1/3 搜索2/3 搜索3/3 我该怎么做?如何在发出Django Rest api请求时更新进度条?,django,django-rest-framework,Django,Django Rest Framework,我的django rest应用程序接受从多个页面中获取价格的请求,并对它们进行比较(这需要5秒钟),然后将每个页面的价格列表作为json对象返回。 我想用当前操作更新用户,例如,如果我刮取3个页面,我想如下更新界面: 搜索1/3 搜索2/3 搜索3/3 我该怎么做? 我使用Angular 2作为我的前端,但这应该不会有太大的区别,因为这是一个后端问题 这不是唯一的方法,但我在Django就是这样做的 你需要的东西 异步工作进程 这允许您在请求-响应周期的上下文之外进行工作。最常见的是非此即彼。
我使用Angular 2作为我的前端,但这应该不会有太大的区别,因为这是一个后端问题 这不是唯一的方法,但我在Django就是这样做的
你需要的东西 异步工作进程 这允许您在请求-响应周期的上下文之外进行工作。最常见的是非此即彼。我推荐django rq,因为它很简单,特别是如果您所实现的只是一个进度指示器的话 缓存层(可选) 虽然在这种情况下可以使用数据库进行持久化,但临时缓存键值存储在这里更有意义,因为进度信息是短暂的。Memcached后端内置于Django中,但我建议切换到,因为它功能更全面、速度更快,而且它位于Django的缓存抽象之后,不会增加复杂性。(这也是使用上述django rq工作进程的要求)
实施 概述 基本上,我们将向服务器发送一个启动异步工作进程的请求,并轮询一个不同的进度指示器端点,该端点给出该工作进程的当前状态,直到它完成(或失败) 服务器端
@job
装饰器)POST
端点应首先生成一个随机唯一ID来标识请求(可能使用uuid
)。然后,将POST数据连同此唯一ID一起传递给异步函数(在django rq中,这类似于function\u name.delay(payload,unique\u ID)
)。由于这是一个异步调用,解释器不会等待任务完成,而是立即继续。返回包含唯一ID的JSON负载的HttpResponsecache.set(unique_id,0)
,以显示到目前为止没有任何进展。使用您自己的数学实现,当进度接近100%完成时,将此值更改为更接近1
。如果由于某种原因操作失败,您可以将其设置为-1
unique\u id
查询参数,并使用该参数通过cache.get(unique\u id)
查找进度。返回一个包含进度量的JSON对象唯一\u id
。立即开始定期轮询进度端点,将unique\u id
设置为查询参数。使用setInterval()
,间隔可能大约为1秒,如果仍有挂起的请求,则逻辑会阻止发送新请求1
(或-1
表示失败)时,您知道该过程已完成,可以停止轮询就这样!仅仅为了获得进度指标需要做一些工作,但是一旦完成了,在其他项目中重复使用该模式就容易多了
另一种我没有探讨过的方法是通过Webhooks/实现。这样,就不需要轮询,服务器直接将消息发送给客户端。您是否使用后端的任何标志跟踪页面计数?还可以编辑您的问题以添加您正在使用的模型和视图。这将有助于更好地调试。我的后端通过URL列表循环并获取价格。我会尽快添加模型