如何设计一个显示服务器需要很长时间生成的数据的网页?

时间:2015-05-28 18:32:12

标签: javascript ajax django celery message-queue

我有一个django驱动的网站,我有一个(慢)python函数

def slow_func(arg1, arg2):
    # some magic goes here
    return result

特别要说slow_func返回需要45秒。

我想向用户提供一个表单,其中包含可以输入arg1arg2值的字段。当他们提交表单时,我希望他们看到一些临时消息,例如"服务器在如何将arg1和arg2转换为结果时非常努力。而服务器却在计算slow_func(arg1, arg2)的输出。然后,一旦服务器计算出结果,我希望用户看到像#34; Man这样的东西很难......我终于完成了工作而答案是(等等)&#34 ;

设置这类东西的正确方法是什么?特别是,我所处理的Web服务器超时时间远远小于我的服务器计算我想要的值所花费的45秒......我需要设置哪些技术组合来完成这项工作?

似乎需要某种方式来启动服务器端的任务(这里没有想法),然后让浏览器继续检查某处以查看作业是否完成(javascript?)......然后,一旦它知道作业完成(javascript)它可能会在一些新创建的URL上点击服务器以异步收集结果并显示它(javacript ajax?)或者可能只是重定向到新生成的URL来查看结果? / p>

我确定这是一个已解决的问题,但我似乎无法正确地为谷歌获得正确的条款。

结局说明:如果给出的答案可以适应slow_func结果的一系列可能类型,那将会很棒。即某些用例可能涉及slow_func返回float ...其他情况可能涉及返回图像等。

1 个答案:

答案 0 :(得分:4)

你的问题可能会被关闭,因为它相当笼统。但是这里有一个如何解决问题的方法,当然还有其他几种方法,这只是一个让你开始的草图。

  1. 向服务器发送ajax request
  2. 在服务器上触发celery task或子进程并在缓存或db
  3. 中保存初始化标志
  4. 返回'确定'或者在服务器之后立即发送消息 任务被触发,因此您的用户实际上不必等待
  5. 显示消息
  6. 每隔x秒(ajax)在后台保留polling服务器以检查进程是否完成,您将需要一些可以通过查看您所拥有的标志状态来验证此类服务器的端点先前设置
  7. 向用户返回成功或仍在等待的消息
  8. 显示该消息
  9. 在完成此过程后将结果保存在缓存或数据库中的某个位置,以便在标记状态更改为完成后停止轮询脚本
  10. 不要重复自己