Celery(4.2):如何获取当前任务的任务ID

时间:2018-08-28 01:15:11

标签: python django celery

AIM

出于闹钟的目的,我试图在Alarm中“获取”由User创建的特定SetAlarmForm

从同一主题的其他答案(Q1Q2Q3)中,我尝试以下行:objx = Alarm.objects.get(id=run_alarm.request.id)。也许,我缺少明显的东西,或者Celery的版本已更新?

错误

[ERROR/ForkPoolWorker-2] raised unexpected: DoesNotExist('Alarm matching query does not exist')

CODE

Models.py

class Alarm(models.Model):
    """ Model representing each Alarm """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

Views.py

class AlarmCreateView(LoginRequiredMixin, CreateView):
    """ CreateView for User to create the Alarm object """
    model = Alarm
    form_class = SetAlarmForm
    template_name = 'weather_alarm/set_alarm.html'
    login_url = "/login/"

    def form_valid(self, form):
        self.create_alarm_object(self.request, form)
        run_alarm.delay()
        return HttpResponseRedirect(self.get_success_url())

Tasks.py

import time
from celery import Celery, shared_task, current_task
from datetime import datetime

from .models import Alarm


@shared_task
def run_alarm():
    """ Function to organise the steps for the alarm using Celery """
    objx = Alarm.objects.get(id=run_alarm.request.id)
    second_countdown = objx.get_alarm_length() # get the length of the alarm, in seconds
    time.sleep(second_countdown) # wait for the alarm time
    conditions_satisfied = objx.check_conditionals() # check if conditionals are satisfied
    if conditions_satisfied == True:                    # conditions are satified
        print("Ring ring!")
        return True
    else:                                               # conditions aren't satisfied
        print("I'm only sleeping!")
        return True

1 个答案:

答案 0 :(得分:3)

解决此问题的最简单方法是使alarmID作为传递给任务的参数:

Tasks.py

@shared_task
def run_alarm(alarmID):
    objx = Alarm.objects.get(id = alarmID)

在视图中调用任务时,您需要传递此ID:

Views.py

...
def form_valid(self, form):
    #making an assumption about what create_alarm_object returns here; you get the idea
    newAlarm = self.create_alarm_object(self.request, form)
    run_alarm.delay(newAlarm.id)

在此处通知如何将参数传递给run_alarm来传递参数到delay。进一步阅读:http://docs.celeryproject.org/en/latest/userguide/calling.html#example

遇到错误的原因是request.id指向正在运行的单个异步celery任务的任务ID,而不是警报对象的ID。进一步阅读:http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request