2017-02-14 49 views
1

我试图运行这个非常简单的瓶/芹菜应用:flask_mail消息实例不是JSON序列化

@celery.task 
    def send_async_email(msg): 
     with app.app_context(): 
      mail.send(msg) 

    @celery.task(bind=True) 

    @app.route('/', methods=['GET', 'POST']) 

    def index(): 
     if request.method == 'GET': 
      return render_template('index.html', email=session.get('email', '')) 
     email = request.form['email'] 
     session['email'] = email 

     msg = Message('Hello from Flask', 
         recipients=[request.form['email']]) 
     msg.body = 'This is a test email sent from a background Celery task.' 
     print type(msg) 
     print dir(msg) 
     print 'msg.send' 
     print msg.send 
     print 'msg' 
     print msg 

     if request.form['submit'] == 'Send': 

      send_async_email.delay(msg) 
      flash('Sending email to {0}'.format(email)) 
     else: 

     return redirect(url_for('index')) 

但它不工作,因为这个消息类的实例没有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对象不是。您应该将方法签名send_async_email(msg)更改为接受简单的JSON兼容对象。也就是说,一个原始字符串,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):