首页 > 解决方案 > Django在完成时保存长时间运行的进程

问题描述

我想创建一个与外部 API 交互的应用程序,该 API 创建和管理一个长时间运行的进程(可以是几分钟/几小时)。只有当过程成功时,Django 应用程序才会保存模型实例。

在提交表单时,触发外部 API 以使用来自表单提交的参数运行进程。外部 API 提供作业 uuid,检查状态的首选方式是什么?是否应该在 while 循环中在 Model save() 中检查(通过对外部 API 的作业状态 GET 请求)?或者,还有更好的方法。

标签: pythondjango

解决方案


编辑:我的回答假设您已经集成了一个异步处理库,例如 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()

推荐阅读