Django-使用选项但不使用函数参数执行Celery任务

时间:2018-07-24 21:06:55

标签: python django celery

我第一次使用芹菜。查看文档,似乎我已经尝试了所有事情来使用apply_async正确执行任务。我正在从信号方法中调用任务,所以它在signal.py中。

signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from datetime import datetime, timedelta

from games.models import Game
from contacts.models import Contact
from msgs.models import SMS
from msgs.tasks import sendSMS_Scheduled


@receiver(post_save, sender=Game)
def createSMS(sender, instance, created, **kwargs):

    if created:

        contacts = Contact.objects.all()
        body = SMS.defaultMessageBuilder(
            location=instance.location,
            time=instance.schedStart
        )
        eta = instance.schedStart - timedelta(hours=7)
        expire = instance.schedStart
        result = sendSMS_Scheduled.apply_async(eta=eta, expires=expire)

tasks.py

from celery import shared_task
from SMSerSite.celery import app
from contacts.models import Contact

from .models import SMS

@shared_task(name='SMSerSite.msgs.tasks.sendSMS', bind=True)
def sendSMS_Scheduled():

    messages = self.request.sms_set.all()

    SMS.sendSMS(messages)

代码运行时,出现错误:sendSMS_Scheduled() takes 0 positional arguments but 1 was given。我尝试了各种方法来编写使用apply_async调用任务的行,但没有任何效果。我这是怎么了?

1 个答案:

答案 0 :(得分:1)

使用bind=True关键字参数时,您的任务会获得对自身的引用,因此将方法签名更改为:

def sendSMS_Scheduled(self):

请注意,在这种情况下,self是实际的芹菜任务。您有一行self.request.sms_set.all(),这让我觉得您期望self是特定于Django的内容。