Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flask_邮件实例不可JSON序列化_Python_Celery Task_Flask Mail - Fatal编程技术网

Python flask_邮件实例不可JSON序列化

Python flask_邮件实例不可JSON序列化,python,celery-task,flask-mail,Python,Celery Task,Flask Mail,我正在尝试运行这个非常简单的烧瓶/芹菜应用程序: @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 =

我正在尝试运行这个非常简单的烧瓶/芹菜应用程序:

  @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: flask@example.com

    EncodeError: <flask_mail.Message object at 0x7ffa94cd0290> is not JSON serializable
msg.send
味精
内容类型:文本/纯文本;charset=“utf-8”
MIME版本:1.0
内容传输编码:7bit
主题:来自Flask的你好
发件人:flask@example.com
EncodeError:不可序列化JSON

能否尝试将flask mail版本降级到0.9.0

您可以使用以下命令执行此操作:

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

芹菜要求通过代理传递的对象可以直接序列化<代码>邮件。邮件对象不可用。您应该更改
send\u async\u email(msg)
的方法签名,以接受简单的JSON兼容对象。也就是说,原始字符串、int、字典或类似的东西。然后,您应该将
消息的所有逻辑(从实例化到发送)移动到该方法中

例如:

@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)

我发现,通过简单地设置序列化并添加更改默认值,效果非常好

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

相关的
@celery.task(serializer='pickle')
def send_async_email(msg):