python - celery (4.2): how to get task id for current task

标签 python django celery

目标

出于闹钟的目的,我尝试“获取”由 UserSetAlarmForm 中创建的特定Alarm

根据同一主题的其他答案( Q1Q2Q3 ),我正在尝试以下行: objx = Alarm.objects.get(id=run_alarm.request.id) 。也许,我遗漏了一些明显的东西,或者 Celery 的版本已经更新了?

错误

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

代码

模型.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

最佳答案

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

Tasks.py

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

在 View 中调用任务时,您需要传递此 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)

请注意如何通过在此处将参数传递给 delay 来将参数传递给 run_alarm。进一步阅读: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

关于python - celery (4.2): how to get task id for current task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52048785/

相关文章:

python - 无法在 Web 浏览器中从 python 打开 html 文件 - 改为用记事本打开

python - sre_constants.error : nothing to repeat in jython

python - 如何在django选择框中显示有限的记录?

python - Apache 与 mod_wsgi 发出有关 django 中数据库的错误

python-3.x - 在 centos 7 上使用 systemd 守护 celery

django - AWS Elastic Beanstalk 上的 Celery 配置问题 - "No config updates to processes"

python - 如何使用同一个 worker 重试 celery ?

c++ - Python 和 C++ 之间的管道不会关闭

python - 在Django shell中输出MySQL查询结果

python - 使用 Azure Functions 的无服务器 Django