基于Celery任务状态更新Django模型字段

时间:2017-12-10 08:36:28

标签: django celery

在我的模型中,我有一个status字段,默认值为'Processing'。在Django管理界面中,用户单击“保存”按钮后,表单输入将传递给芹菜任务,该任务只需休眠30秒。

在30秒之后,我该怎么做:

  1. 确定芹菜任务是否成功?
  2. 将模型的status字段从“处理”更新为实际状态(例如:已完成,失败?
  3. models.py

    from django.db import models
    
    class Scorecard(models.Model):
    
        name = models.CharField(max_length=100, unique=True)
        status = models.CharField(max_length=20, default='Processing')
    
        def __str__(self):
            return self.name
    

    admin.py

    from django.contrib import admin
    from scorecards.models import Scorecard
    from scorecards.tasks import get_report
    
    class ScorecardAdmin(admin.ModelAdmin):
        list_display = ['name', 'status']
    
        def save_model(self, request, obj, form, change):
            if form.is_valid():
                data = form.cleaned_data
                name = data['name']
                get_report.delay(name)
            super().save_model(request, obj, form, change)
    
    admin.site.register(Scorecard, ScorecardAdmin)
    

    tasks.py

    from __future__ import absolute_import, unicode_literals
    from celery import shared_task
    from time import sleep
    
    @shared_task
    def get_report(name):
        sleep(30)
    

    每隔x个时间间隔更新status字段的芹菜任务的实时状态会很好,但是现在我真的很好奇如何做到这一点。

1 个答案:

答案 0 :(得分:1)

我还没有弄清楚实时状态(但是)但是一旦任务完成,它就会设法改变状态。

以下是主要部分。了解其原因的关键原因是我在--pool=solo开始了这样的芹菜工作者:

celery -A scorecard worker --pool=solo -l info

这是一个单线程执行池(对我目前的用途来说很好),但这意味着它将处理第一个任务get_report(name),完成后,处理{{1}它检查结果的状态,并将状态字段设置为实际状态。

models.py

set_task_status(id)

admin.py

class Scorecard(models.Model):
    ....
    task_id = models.CharField(max_length=50)

tasks.py

class ScorecardAdmin(admin.ModelAdmin):
    ...
            result = get_report.delay(name)
            set_task_status.delay(result.task_id)
    ...

这是我到目前为止所知道的。