在Django中,celery任务完成后更新UI的最佳方法是什么?

5 投票
2 回答
976 浏览
提问于 2025-04-18 04:09

我想让用户点击一个按钮来生成报告,显示一个生成报告的动画,然后在报告生成完成后,页面上显示“成功”这个字。

我在考虑,当用户点击生成报告的按钮时,创建一个celery任务。那我该如何在任务完成后更新用户界面呢?我是不是应该通过AJAX不断检查任务是否完成?有没有更好的方法或者在Django中可以帮助这个过程的第三方通知应用呢?

谢谢!

编辑:我做了更多的研究,发现的唯一方法是使用django-angulardjango-websocket-redis进行三方数据绑定。感觉为了这个小功能有点过于复杂了。我想如果没有web sockets,唯一的办法就是每隔一段时间不断地向后台请求,检查任务是否完成。还有其他想法吗?

2 个回答

0

轮询是一种简单而有效的解决方案。对于一些简单的功能,尽量不要给你的网站增加不必要的负担。

while Result.state == u'PENDING':
  #do your stuff

if Result.state == u'SUCCESS':
  #Finished
else:
  #something wrong
1

需要注意的是,轮询意味着你会保持请求和连接一直打开。在访问量很大的网页应用中,这样会浪费很多资源。不过,对于一些小网站来说,保持连接打开可能就没那么严重。建议你选择一种现在最容易实现的策略,以后如果真的遇到性能问题,再进行调整也不迟。

撰写回答