首页 > 解决方案 > 在运行其余方法时在 celery 中发送电子邮件

问题描述

我试图通过 celery 完成发送电子邮件部分来更快地向页面发出我的请求,这样该方法的其余部分就可以运行并完成,而无需等待发送电子邮件。

我以前尝试过使用异步并打过芹菜电话,但我不熟练,需要那个部门的一些帮助

def checkout():
    if request.method == 'POST':
        username = User.get_username(session['email'])

        #todo: do the next line in celery

        send_email(username, session['email_to'])
        session['email_to'] = None
        flash('Youre request has been sent')
        return redirect(url_for('home'))

    return render_template('transaction/checkout.html')

发送电子邮件.py

def send_email(username_from, email):
    from_email = os.get('email')
    from_password = 'rnmmhgtlcaqsxows'
    to_email = os.get('email')

    subject = f'New Request from {username_from}'
    message = f"You have a request from {username_from}"

    msg = MIMEText(message, 'html')
    msg['subject'] = subject
    msg['To'] = to_email
    msg['From'] = from_email

    gmail = smtplib.SMTP('smtp.gmail.com',587)
    gmail.ehlo()
    gmail.starttls()
    gmail.login(from_email, from_password)
    gmail.send_message(msg)

标签: pythonemailflaskcelery

解决方案


Imaginesend_email是一个 Celery 任务。- 有就足够了

send_email.apply_async()

在您的代码中将该任务放在默认的 Celery 队列中,它将由 Celery 选择并执行,而其余代码继续工作。


推荐阅读