Почему этот простой скрипт Flask занимает так много времени? - PullRequest
0 голосов
/ 08 февраля 2019

Это просто сценарий, который отправляет письмо после отправки формы:

@application.route('/contact', methods=['GET', 'POST'])
def send():
    if request.method == 'POST':
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        email = request.form['email']
        msg = Message('Hey!', sender='example@example.com', recipients=['example@example.com'])
        msg.body = email + " " + first_name + " " + last_name + " "
        mail.send(msg)
        msg2 = Message('Hello', sender='example@example.com', recipients=[email])
        msg2.body = "Hi " + first_name + ". Thanks for requesting access to our beta. We'll contact you soon to schedule a call."
        mail.send(msg2)

        return render_template('contact.html')

    return render_template ('index.html')

Обе электронные письма доставляются, но для обработки сценария требуется слишком много времени, что приводит к меньшему количеству регистраций.Что не так?

На всякий случай, я размещаю это приложение Flask на экземпляре Elastic Beanstalk.

1 Ответ

0 голосов
/ 08 февраля 2019

Отправка электронной почты - это операция, которая занимает много времени.Если вы включите журналы, вы увидите, что сделано несколько звонков.Это не относится к AWS или вашему серверу.

Отправка электронных писем должна быть асинхронной задачей в вашем приложении фляги.

Есть много способов сделать это.Вы можете просто провести рефакторинг своего кода и написать функцию с помощью @async декоратора, мега-учебника о колбах , который довольно хорошо описывает детали.

#[...other imports...]
from threading import Thread

def async(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target=f, args=args, kwargs=kwargs)
        thr.start()
    return wrapper

@async
def send_async_email(app, msg):
    with app.app_context():
        mail.send(msg)

@application.route('/contact', methods=['GET', 'POST'])
def send():
    if request.method == 'POST':
        first_name = request.form['first_name']
        last_name = request.form['last_name']
        email = request.form['email']
        msg = Message('Hey!', sender='example@example.com', recipients=['example@example.com'])
        msg.body = email + " " + first_name + " " + last_name + " "
        send_async_email(application, msg)
        msg2 = Message('Hello', sender='example@example.com', recipients=[email])
        msg2.body = "Hi " + first_name + ". Thanks for requesting access to our beta. We'll contact you soon to schedule a call."
        send_async_email(application, msg)

        return render_template('contact.html')

    return render_template ('index.html')

Поскольку вы запускаете свое приложение на AWS, вытакже может использовать SES вместо Flask-Mail.

Другие решения могут заключаться в использовании очереди сообщений , такой как RabbitMQ, но это потребует написания гораздо большего количества кода.

Все эти решения сделают электронную почту отправленной в фоновом режиме, что позволит вашему приложению в колбе возвращать ответ клиенту, не дожидаясь отправки электронной почты.

...