python - Django在完成时保存长时间运行的进程
问题描述
我想创建一个与外部 API 交互的应用程序,该 API 创建和管理一个长时间运行的进程(可以是几分钟/几小时)。只有当过程成功时,Django 应用程序才会保存模型实例。
在提交表单时,触发外部 API 以使用来自表单提交的参数运行进程。外部 API 提供作业 uuid,检查状态的首选方式是什么?是否应该在 while 循环中在 Model save() 中检查(通过对外部 API 的作业状态 GET 请求)?或者,还有更好的方法。
解决方案
编辑:我的回答假设您已经集成了一个异步处理库,例如 celery。
一种解决方案是创建一个模型来跟踪这些任务。然后创建一个任务chain
,这样当您的外部 API 任务完成时,它会馈送到另一个将跟踪器标记为完成的任务。这可能不是您所需要的,但它提供了您可以做什么的一般概念。
模型:
class FormSubmissionTracker(models.Model):
created = ...
updated = ...
user = ... # Maybe?
completed = models.DateTimeField(null=True, blank=True)
任务:
@shared_task # Or however you define your tasks.
def complete_tracker(tracker_id):
FormSubmissionTracker.objects.filter(
completed__isnull=True,
id=tracker_id,
).update(completed=timezone.now())
看法:
def view(request):
form = Form()
if form.is_valid():
tracker = FormSubmissionTracker.objects.create(user=request.user)
task = YourExternalTask.si() # This maybe should be .s() depending on your use case
(task | complete_tracker.si(tracker.id)).apply_async()
推荐阅读
- c# - 未提供 CheckId 时,如何在 Visual Studio 中抑制来自 Newtonsoft.Json 的警告?
- python - 如何使用 Python 在 Selenium 中使用用户名和密码对代理进行身份验证
- reactjs - 循环内的 expo SMS.sendSMSAsync 弹出短信模式并立即关闭
- git - 如何将推送恢复为 master,然后再次从新分支推送相同的更改?
- python - pyodbc ValueError: 月份必须在 1.. 12
- python - 如何使用 SQLite3 和 Python 更新 SQLite 表中的行
- c - Intel-TSX:为什么 rtm 失败了?
- ssl - ESP32-CAM 如何将大型二进制有效负载发布到 AWS IOT ssl mqtt 主题,测试了许多库但没有成功:-(
- html - 如果表格中的单元格中有文本,如何将文本添加到与单元格最右侧对齐的同一单元格中?
- javascript - 当我将它传递给套接字 io 时,对象失去了它的原型功能