9

我最近一直在忙于软件开发,并且已经成功地将芹菜弯曲成我的意愿。

我已经成功地使用它来发送电子邮件,并且刚刚尝试使用几乎完全相同的代码(在重新启动所有进程等之后)通过 Twilio 发送短信。

但是我不断收到以下问题:

File "/Users/Rob/Dropbox/Python/secTrial/views.py", line 115, in send_sms
send_sms.delay(recipients, form.text.data)
AttributeError: 'function' object has no attribute 'delay'

我的代码如下:

@celery.task
def send_email(subject, sender, recipients, text_body):
    msg = Message(subject, sender=sender)
    for email in recipients:
        msg.add_recipient(email)
    msg.body = text_body
    mail.send(msg)

@celery.task
def send_sms(recipients, text_body):
    for number in recipients:
        print number
        num = '+61' + str(number)
        print num
        msg = text_body + 'this message to' + num
        client.messages.create(to=num, from_="+14804054823", body=msg)

从我的 views.py 调用时 send_email.delay 工作正常,但是 send_sms.delay 每次都因上述错误而失败。

任何有关故障排除的帮助表示赞赏。

- 按照要求:

@app.route('/send_mail', methods=['GET', 'POST'])
@roles_accepted('Admin')
def send_mail():
    form = SendMailForm(request.form)
    if request.method == 'POST':
        if form.validate_on_submit():
            emails = db.session.query(User.email).all()
            list_emails = list(zip(*emails)[0]) 
            send_email.delay('Subject', 'sender@example.com', list_emails, form.text.data)
    return render_template('send_generic.html', form=form)

@app.route('/send_sms', methods=['GET', 'POST'])
@roles_accepted('Admin')
def send_sms():
    form = SendMailForm(request.form)
    if request.method == 'POST':
        if form.validate_on_submit():
            recipients = db.session.query(User.mobile).all()
            list_recipients = filter(None, list(zip(*recipients)[0]))
            send_sms.delay(list_recipients, form.text.data)
    return render_template('send_generic.html', form=form, send_sms=send_sms)

我的 send_sms celery 装饰功能显示为已注册任务:

(env)RP:secTrial Rob$ celery inspect registered
-> celery@RP.local: OK
    * app.send_email
    * app.send_security_email
    * app.send_sms

对于配置,我只是使用 guest:rabbitmq

CELERY_BROKER_URL = 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
4

1 回答 1

19

视图名称send_sms与 celery 任务名称冲突。当在包含视图的模块中使用时,名称send_sms引用视图,而不是任务。

使用不同的名称以避免覆盖。

于 2014-10-17T00:34:11.237 回答