Moh*_*aka 0 django django-rest-framework
我的django rest app接受请求刮取多个页面的价格并比较它们(需要时间~5秒)然后返回每个页面的价格列表作为json对象.我想用当前操作更新用户,例如,如果我刮3页我想更新界面,如下所示:搜索1/3搜索2/3搜索3/3我该怎么办?我使用Angular 2作为我的前端,但这不应该产生很大的不同,因为它是一个后端问题.
这不是唯一的方法,但这就是我在Django中的表现方式.
这允许您在请求 - 响应周期的上下文之外执行工作.最常见的是django-rq或Celery.我推荐django-rq的简单性,特别是如果你所有的实现都是一个进度指示器.
虽然在这种情况下可以使用数据库进行持久化,但临时缓存键值存储在这里更有意义,因为进度信息是短暂的.Memcached后端内置于Django中,但我建议切换到Redis,因为它功能更全面,速度更快,而且由于它支持Django的缓存抽象,因此不会增加复杂性.(这也是使用上面的django-rq工作进程的要求)
基本上,我们将向服务器发送请求以启动异步工作程序,并轮询一个不同的进度指示器端点,该端点提供该工作程序进度的当前状态,直到它完成(或失败).
重构您想要跟踪进入异步任务函数的进度的函数(@job在django-rq的情况下使用装饰器)
初始POST端点应首先生成随机唯一ID以标识请求(可能带有uuid).然后,将POST数据与此唯一ID一起传递给异步函数(在django-rq中,这看起来就像function_name.delay(payload, unique_id)).由于这是异步调用,因此解释器不会等待任务完成并立即继续.返回包含唯一ID的JSON有效内容的HttpResponse.
回到异步函数,我们需要使用缓存设置进度.在函数的最顶层,我们应该添加一个cache.set(unique_id, 0)来表明到目前为止没有进展.使用您自己的数学实现,当进度接近100%完成时,将此值更改为更接近1.如果由于某种原因操作失败,您可以将其设置为-1.
创建一个由浏览器轮询的新端点以检查进度.这将查找unique_id查询参数并使用它来查找进度cache.get(unique_id).返回具有进度金额的JSON对象.
在发送操作的POST请求并收到响应后,该响应应包括unique_id.立即开始定期轮询进度端点,将其设置unique_id为查询参数.间隔可能是1秒钟使用setInterval(),如果仍有待处理的请求,则使用逻辑来阻止发送新请求.
当收到的进度等于1(或-1失败)时,您知道该过程已完成,您可以停止轮询
而已!获得进度指标只是一些工作,但是一旦你完成它,就可以更容易地在其他项目中重复使用该模式.
我没有探索的另一种方法是通过Webhooks/Channels.这样,不需要轮询,服务器只是直接将消息发送给客户端.
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |