从Django视图调用pythoncli程序并异步显示结果?

2024-09-30 01:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是我在views.py中使用的一段代码片段

from cliproject.main import clirunner
# Some code for file upload and saving
clirunner()

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

问题是,整个过程在这一刻是同步的。因此,用户页面将在用户从UI上传文件之后加载,直到它在后台被pythoncli脚本处理为止。 流程如下

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

因此,我们可以在这里看到我调用不同CLI程序的问题视图.py去做我想做的事。但这是同步发生的。你知道吗

我需要的是使进程异步,我想显示一些东西作为加载条,以通知他们cli程序正在后端执行,并且它的状态为。 CLI程序执行完毕后,加载条将达到100%,DjangoUI将异步显示输出

我试过芹菜。但是我不知道如何使这个加载条基于pythoncli脚本工作。有什么想法吗?你知道吗


Tags: and文件the用户py脚本uioutput
1条回答
网友
1楼 · 发布于 2024-09-30 01:25:09

我有个想法,你需要:

A)异步启动任务

B)能够获得其当前状态的值。你知道吗

有个主意:

1)使任务成为管理.py可以使用线程或芹菜任务调用调用的命令。你知道吗

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

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

这样,您的视图提交并启动任务,它负责标记自己的工作,然后另一个视图只进行一个快速的db查询以找出它在哪里。你知道吗

编辑为添加:您还可以使用cache后端并写入memcached、redis等中的键,以避免对关系数据库执行ping操作。你知道吗

相关问题 更多 >

    热门问题