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

