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

Celery调用send_verification报错:需1个参数却传入3个

解决Celery任务传参TypeError问题

问题原因

你遇到的TypeError('send_verification() takes 1 positional argument but 3 were given')错误,核心原因是:

  • 当使用@shared_task(bind=True)装饰器时,Celery会自动把任务实例作为第一个参数(self)传入函数
  • 你调用send_verification.delay(email, domain)时,相当于传递了3个参数:self、email、domain
  • 要么你的Celery Worker没有加载最新代码(比如之前的任务函数仅定义1个参数),要么bind=True是多余的(你没用到任务实例的功能)

解决方案

方案1:移除不必要的bind=True

你的任务函数没有使用self(比如没有调用self.retry()或访问任务实例属性),完全可以去掉bind=True,修改任务代码:

@shared_task
def send_verification(email, domain):
    print(email)
    try:
        email_from = settings.EMAIL_HOST_USER
        token = generate_token(email)
        verify_url = f'http://{domain}{reverse("verify_email", args=[token])}'
        subject = 'Verify your email address'
        message = f'Click the link to verify your email: {verify_url}'
        send_mail(subject, message, email_from, [email])
        print(message)
    except Exception as e:
        print(f'Error sending email: {e}')
    print("Done")
    return "Done"

方案2:保留bind=True并重启Celery Worker

如果你后续需要使用任务实例的功能(比如重试机制),保留bind=True,但必须重启Celery Worker,确保它加载了最新的任务函数代码(否则Worker会继续运行旧的、参数不匹配的代码)。

调用代码无需修改,当前的send_verification.delay(email, domain)是正确的,self会由Celery自动传入。


内容的提问来源于stack exchange,提问作者AJAS KM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:25:03