You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django框架中Celery异步发邮件任务报ValueError解包异常

解决Celery执行Django异步邮件任务时的ValueError问题

这个ValueError: not enough values to unpack (expected 3, got 0)错误,本质是Celery在加载和执行任务时无法正确解析任务上下文信息,大概率是因为你使用了过时的Celery任务装饰器,导致和自定义的Celery实例冲突了。下面是具体的修复步骤:

1. 替换过时的任务装饰器

你当前用的from celery.decorators import task是Celery旧版本的用法,在自定义了项目Celery实例的场景下,会导致任务注册异常。需要改成从你项目的Celery实例导入装饰器:

修改task.py:

# 导入你项目的Celery实例,路径对应你的celery.py所在位置
from ECartApplication.celery import app
from django.core.mail import EmailMessage
import time

@app.task(name="Sending_Emails")
def send_email(to_email, message):
    time1 = 1
    # 原循环条件只会发送4次邮件,改成<=5才能达到你预期的5次
    while time1 <= 5:
        print("Sending Email")
        email = EmailMessage(
            'Checking Asynchronous Task', 
            f"{message}{time1}", 
            to=[to_email]
        )
        email.send()
        time.sleep(1)
        time1 += 1

2. 确保任务被正确自动发现

检查你的celery.py配置,确保autodiscover_tasks()能正确扫描到所有INSTALLED_APPS中的tasks.py文件:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ECartApplication.settings')
app = Celery('ECartApplication')
app.config_from_object('django.conf:settings')
# 自动发现所有已注册APP中的任务
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

同时确认你的任务所在的APP已经添加到settings.py的INSTALLED_APPS列表中,否则Celery无法找到这个任务。

3. 重启Celery Worker

修改完代码后,必须重启Celery Worker才能加载新的任务定义:

celery -A ECartApplication worker -l info

额外注意事项

  • 原代码中的循环条件while(time1 != 5)会导致邮件只发送4次(time1从1到4),我已经改成time1 <=5来满足你发送5次邮件的需求。
  • 关闭settings.py中的DEBUG=True,Celery已经警告你生产环境使用DEBUG会导致内存泄漏,虽然这不是本次错误的直接原因,但长期运行会有问题。

完成以上步骤后,你的异步邮件任务应该就能正常执行,发送5次邮件了。

内容的提问来源于stack exchange,提问作者Vipin Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:49:48