Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在发出Django Rest api请求时更新进度条?_Django_Django Rest Framework - Fatal编程技术网

如何在发出Django Rest api请求时更新进度条?

如何在发出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就是这样做的 你需要的东西 异步工作进程 这允许您在请求-响应周期的上下文之外进行工作。最常见的是非此即彼。

我的django rest应用程序接受从多个页面中获取价格的请求,并对它们进行比较(这需要5秒钟),然后将每个页面的价格列表作为json对象返回。 我想用当前操作更新用户,例如,如果我刮取3个页面,我想如下更新界面: 搜索1/3 搜索2/3 搜索3/3 我该怎么做?
我使用Angular 2作为我的前端,但这应该不会有太大的区别,因为这是一个后端问题

这不是唯一的方法,但我在Django就是这样做的


你需要的东西 异步工作进程 这允许您在请求-响应周期的上下文之外进行工作。最常见的是非此即彼。我推荐django rq,因为它很简单,特别是如果您所实现的只是一个进度指示器的话

缓存层(可选) 虽然在这种情况下可以使用数据库进行持久化,但临时缓存键值存储在这里更有意义,因为进度信息是短暂的。Memcached后端内置于Django中,但我建议切换到,因为它功能更全面、速度更快,而且它位于Django的缓存抽象之后,不会增加复杂性。(这也是使用上述django rq工作进程的要求)


实施 概述 基本上,我们将向服务器发送一个启动异步工作进程的请求,并轮询一个不同的进度指示器端点,该端点给出该工作进程的当前状态,直到它完成(或失败)

服务器端
  • 将要跟踪其进度的函数重构为异步任务函数(对于django rq,使用
    @job
    装饰器)

  • 初始
    POST
    端点应首先生成一个随机唯一ID来标识请求(可能使用
    uuid
    )。然后,将POST数据连同此唯一ID一起传递给异步函数(在django rq中,这类似于
    function\u name.delay(payload,unique\u ID)
    )。由于这是一个异步调用,解释器不会等待任务完成,而是立即继续。返回包含唯一ID的JSON负载的HttpResponse

  • 回到异步函数中,我们需要使用缓存设置进度。在函数的最顶端,我们应该添加一个
    cache.set(unique_id,0)
    ,以显示到目前为止没有任何进展。使用您自己的数学实现,当进度接近100%完成时,将此值更改为更接近
    1
    。如果由于某种原因操作失败,您可以将其设置为
    -1

  • 创建要由浏览器轮询的新端点以检查进度。这将查找
    unique\u id
    查询参数,并使用该参数通过
    cache.get(unique\u id)
    查找进度。返回一个包含进度量的JSON对象

  • 客户端
  • 发送操作的POST请求并收到响应后,该响应应包括
    唯一\u id
    。立即开始定期轮询进度端点,将
    unique\u id
    设置为查询参数。使用
    setInterval()
    ,间隔可能大约为1秒,如果仍有挂起的请求,则逻辑会阻止发送新请求

  • 当收到的进度等于
    1
    (或
    -1
    表示失败)时,您知道该过程已完成,可以停止轮询


  • 就这样!仅仅为了获得进度指标需要做一些工作,但是一旦完成了,在其他项目中重复使用该模式就容易多了


    另一种我没有探讨过的方法是通过Webhooks/实现。这样,就不需要轮询,服务器直接将消息发送给客户端。

    您是否使用后端的任何标志跟踪页面计数?还可以编辑您的问题以添加您正在使用的模型和视图。这将有助于更好地调试。我的后端通过URL列表循环并获取价格。我会尽快添加模型