【问题标题】:Django/Celery - Object matching query does not exist only when using delayDjango/Celery - 对象匹配查询仅在使用延迟时不存在
【发布时间】:2020-12-27 03:57:40
【问题描述】:

我正在使用 Django 和 Celery 异步发送邮件。当我调用调用任务的视图函数时,出现以下错误:

[2020-09-08 17:47:49,148: ERROR/ForkPoolWorker-8] 任务 main_app.tasks.send_notice[244944f6-604c-47a0-901a-4c510563d76e] 引发意外:DoesNotExist('通知匹配查询不存在.')

这只发生在我使用延迟时。如果我调用 send_notice_task(notice_id) 而不是 send_notice_task.delay(notice_id) 它可以找到通知,但延迟它会不断抛出该错误。有什么想法吗?

/views.py

def notice_approve(request, notice_id):
    notice = Notice.objects.get(id=notice_id)
    notice.approve()
    # send_notice_task(notice_id)
    send_notice_task.delay(notice_id)
    return redirect('manage')

/tasks.py

def send_notice_task(notice_id):
    print(notice_id)
    notice = Notice.objects.get(id=notice_id)
    subscribers = Subscriber.objects.filter(approved=True)
    recipient_list = []
    for sub in subscribers:
        recipient_list.append(sub.email)
    datatuple = (f'{notice.subject} - Notice',
        html_message,
        'CONCERN Network <cnb@gmail.com>',
        recipient_list)
    send_mass_mail((datatuple,), fail_silently=False)

【问题讨论】:

    标签: django celery django-celery celery-task


    【解决方案1】:

    我也有类似的问题。

    原因:发生这种情况是因为任务在查询命中数据库之前运行

    解决方案:所以强制任务在运行前等待 3 秒为我解决了这个问题。

    例如,通过改变

    send_notice_task.delay(notice_id)
    

    send_notice_task.apply_async((order.id,), countdown=3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 2013-07-27
      • 2015-03-13
      • 2021-07-19
      • 1970-01-01
      • 2014-04-06
      • 2015-01-28
      相关资源
      最近更新 更多