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
相关产品推荐
相关产品推荐

