zoukankan      html  css  js  c++  java
  • TypeError: send_mail() argument after ** must be a mapping, not str

    在flask中,使用Celery实现一步发送邮件,在编写send_mail方法时,传入的参数写法要注意:

    @celery.task
    def send_mail(r, subject, template, **kwargs):
        app = current_app._get_current_object()
        msg = Message(
            subject=subject,
            recipients=[r],
            sender=app.config['MAIL_USERNAME']
        )
        msg.html = render_template(template + '.html', **kwargs)
        msg.body = render_template(template + '.txt', **kwargs)
        mail.send(msg)

    以上是我的send_mail方法,一共有4个参数,前面三个是固定的,后面一个是**kwargs(里面传入键值)

    当我在视图函数中传参数时,要注意书写格式:

    send_mail.apply_async(args=[form.email.data, '账户激活', 'email/activate'],
                                  kwargs={'username':form.username.data,'token':token.decode('utf-8')})

    鼠标邮件+ctrl看apply_async方法:

     所以由上可知,当后面需要携带其他的键值对的时候(方便在前端渲染或者验证,比如username,token等),一定要把kwargs带着,不然会报错:

    其次,携带的token需要是str,原本生成的token是字节bytes,需要decode为utf-8,否则也会报错:

    以上是我在flask上使用Celery发送邮件时,需要注意的问题。

    其次,在flask上使用Celery发送邮件,还需要注意几个问题:

      1. celery上下文的问题;

           2. 需要设置SERVER_NAME,也是因为上下文的问题,否则报错;

      我在下一篇随笔中记录一下,希望帮助有需要的人,避免走弯路~

  • 相关阅读:
    电梯调度之调研报告
    小作业之测试篇
    求固定数组的最大子数组
    四则运算之C++实现篇
    四则运算2之设计思路篇
    轻松记账工程冲刺第十天
    轻松记账工程冲刺第九天
    轻松记账工程冲刺第八天
    简评QQ拼音输入法
    轻松记账工程冲刺第七天
  • 原文地址:https://www.cnblogs.com/aidenzdly/p/12666793.html
Copyright © 2011-2022 走看看