从django视图调用Python CLI程序并异步显示结果?

时间:2018-06-07 18:43:30

标签: python django asynchronous django-views celery

我有一个django项目,有一个可以上传文件的网络界面,上传成功后,它会调用软件的cli版本来处理它,并在成功执行后返回结果

这是我在views.py

中使用的一小段代码
from cliproject.main import clirunner
# Some code for file upload and saving
clirunner()

这将运行main.py目录中的命令行python脚本cliproject/,它将执行一些操作并保存输出

问题是,此过程整个过程都是同步的。因此,用户页面在从UI上载文件之后加载,直到它在后台由Python CLI脚本处理。 流程如

Django UI
   | (User upload files)
views.py gets request and saves it somewhere
   | (views run clirunner() to give python cli program control)
cliproject runs
   | (After doing the stuff which is intended, it saves the output file)
views.py resumes
   | (Reads the output file)
Django UI displays the output file

所以,我们可以看到这里的问题,我从views.py调用一个不同的CLI程序来做我想要的东西。但它同步发生。

我需要的是使进程异步并且我希望将某些内容显示为加载栏以通知他们cli程序正在后端执行及其状态。 CLI程序完成后执行,然后加载栏将达到100%并且异步django UI将显示输出

我试过芹菜。但我无法弄清楚如何使这个加载栏工作基于python cli脚本。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我有一个想法,你需要:

A)以异步方式启动任务

B)能够获得其当前状态的值。

这是一个想法:

1)使任务成为manage.py命令,您可以使用线程调用或使用Celery任务调用。

2)当任务执行时,让它使用Django模型将其当前完成状态写入您选择的DB。 (上面的步骤旨在简化DB的使用。如果需要,可以直接编写。)

3)将任务ID(由您分配或由Celery生成,在索引的db列上)传递给模板上下文,并使用AJAX调用ping一个视图,该视图返回数据库查找完成的百分比,然后设置你从那里完成。

这样,您的视图提交并启动任务,它负责标记自己的工作,然后另一个视图只是进行快速数据库查询以找出它的位置。

编辑添加:您还可以使用cache后端并写入memcached,redis等内容的密钥,以避免ping关系数据库。