2017-02-14 14 views
1

ではない私は、この非常に単純なフラスコ/セロリのアプリケーションを実行しようとしていますflask_mail MessageインスタンスがJSONシリアライズ可能な

msg.send 
    <bound method Message.send of <flask_mail.Message object at 0x7ffa94cd0290>> 
    msg 
    Content-Type: text/plain; charset="utf-8" 
    MIME-Version: 1.0 
    Content-Transfer-Encoding: 7bit 
    Subject: Hello from Flask 
    From: [email protected] 

    EncodeError: <flask_mail.Message object at 0x7ffa94cd0290> is not JSON serializable 

答えて

-1

フラスコメールバージョンを0.9.0にダウングレードしようとすることはできますか?

あなたは、このコマンドでそれを行うことができます。

pip uninstall Flask-Mail 
pip install Flask-Mail==0.9.0 
4

セロリは、ブローカーを通じて渡されたオブジェクトは素直に直列化可能である必要があります。 flask_mail.Messageオブジェクトはそうではありません。単純なJSON互換オブジェクトを受け入れるには、send_async_email(msg)のメソッドシグネチャを変更する必要があります。つまり、生の文字列、int、それらの辞書、または類似のものです。その後、そのメソッド内のMessage(インスタンス化から送信へ)のすべてのロジックを移動する必要があります。例えば

@celery.task 
def send_async_email(message_details): 
    with app.app_context(): 
     msg = Message(message_details['subject'], 
         message_details['recipients']) 
     msg.body = message_details['body'] 
     print type(msg) 
     print dir(msg) 
     print 'msg.send' 
     print msg.send 
     print 'msg' 
     print msg 
     mail.send(msg) 
0

私は単純でシリアライズを設定し、魔法のようにデフォルトの動作を変更する追加することがわかりました。その後、

app.config.update(
accept_content=['json','pickle'] 
) 

@celery.task(serializer='pickle') 
def send_async_email(msg): 
関連する問題