1

我正在使用 Flask-Mail 扩展来启用应用程序中的邮件发送。我无法让 celery 与烧瓶一起使用,所以我查找了其他一些库并找到了Redis Queue

代码:

     from flask.ext.mail import Mail,Message
     from rq import Queue

     mail = Mail() # mail.init_app(app) is done in top app.py

     q = Queue()

     @mod.route('/test')
     def m11():
         msg = Message("Signup Successfull",
                  recipients=['abc@gmail.com'])
         msg.body = "Hello there, Welcome!"
         q.enqueue(mail.send, msg)
         return 'done'

当我运行代码时,rqworker 中的邮件发送失败,出现以下错误:

    17:04:49: *** Listening on default...
    17:06:08: default: flaskext.mail.send(<flaskext.mail.message.Message object at         
                       0x1027a9750>) (8c86f0f9-ae76-4297-bf17-a171a67f1b44)
    17:06:08: 'module' object has no attribute 'send'
    17:06:08: Moving job to failed queue.

这个错误的原因是什么?

编辑:没有属性 send 是因为 send 是一个实例方法。

现在有不同的问题。我收到邮件对象没有任何属性应用程序的错误。我猜 rq 的新进程不知道我的烧瓶应用程序,因此不知道错误。如何解决这个问题呢?

4

1 回答 1

4

您正在尝试将邮件对象实例的发送方法排入队列,而 RQ 无法将实例方法排入队列。如果您查看页面底部的文档,它会提到这一点:

http://python-rq.org/docs/

尝试定义另一种方法并以这种方式发送邮件。如...

from flask.ext.mail import Mail,Message
from rq import Queue

mail = Mail()
q = Queue()

def queue_mail(msg):
    mail.send(msg)

@mod.route('/test')
def m11():
    msg = Message("Signup Successfull",
                  recipients=['abc@gmail.com'])
    msg.body = "Hello there, Welcome!"
    q.enqueue(queue_mail, msg)
    return 'done'
于 2012-07-18T14:53:57.020 回答