1

Flask-Mail 拡張機能を使用して、アプリでメールを送信できるようにしています。フラスコでセロリを動作させることができなかったので、他のライブラリを調べて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 はありませんでした。

今は別の問題があります。Mail オブジェクトに app 属性がないというエラーが表示されます。rq の新しいプロセスは私のフラスコアプリを認識していないため、エラーが発生したと思います。この問題を解決するには?

4

1 に答える 1

4

メールオブジェクトインスタンスのsendメソッドをエンキューしようとしていますが、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 に答える