Есть ли более быстрый и эффективный способ отправки электронной почты в django, чтобы пользователю не приходилось ждать все время загрузки страницы.

Я делаю сайт, на котором пользователь регистрируется, чтобы забронировать инструктора на определенный период времени в соответствии с выбранным им планом. Есть три плана, из которых пользователь может выбрать, а именно 7 дней, 14 дней и 21 день. После регистрации пользователь должен принять соглашение, а затем на основе выбранного им плана устанавливается дата истечения срока действия со дня принятия пользователем соглашения.

Теперь после того, как пользователь принял соглашение, копия соглашения отправляется пользователю, а также владельцам сайта по электронной почте. Владельцы хотят, чтобы эта система , где копия соглашения получена как пользователем, так и ими. Я в состоянии сделать это, и сайт отлично работает на стадии тестирования. Итак, в основном, два электронных письма отправляются после того, как пользователь принимает предложение, и обновляется модель Contract.

Теперь я заметил, что отправка двух писем занимает много времени, и страница продолжает загружаться, пока оба письма не будут отправлены, а затем происходит перенаправление и все происходит для пользователя. Это время ожидания может спровоцировать некоторых пользователей нажать кнопку "назад", прерывая smtp-соединение, и тогда попытка принять соглашение снова вызовет ошибку неловкости, а также обеспечит плохой пользовательский опыт. Приведенный ниже код позволяет это сделать.

views.py (выкладываю только часть, где план составляет 7 дней)


    if request.method == 'POST':
           agreement = Contract()
           
           if request.user.plan == '7days':
                agreement.user = request.user
                agreement.contract_status = True
                expiry = datetime.now() + timedelta(days=7)
                agreement.date_of_acceptance = datetime.now()
                agreement.date_of_expiration = expiry
                agreement.save()
           
                # for the customers
                template = render_to_string('contract_email.html', {'name': request.user.full_name, 'email': request.user.email, 'plan': request.user.plan,'price': 2000, 'accept': agreement.date_of_acceptance, 'expire':agreement.date_of_expiration})
                email = EmailMessage(
                    'Copy of Contract',                                   #subject
                    template,                                                      # body
                    settings.EMAIL_HOST_USER,
                    [request.user.email],                                       # sender email
                )
                email.fail_silently = False
                email.content_subtype = 'html'       # WITHOUT THIS THE HTML WILL GET RENDERED AS PLAIN TEXT
                email.send()

                #for the owners

                template = render_to_string('contract_email.html', {'name': request.user.full_name, 'email': request.user.email, 'plan': request.user.plan,'price': 2000, 'accept': agreement.date_of_acceptance, 'expire':agreement.date_of_expiration})
                email = EmailMessage(
                    'Copy of Customer Contract',                                   #subject
                    template,                                                      # body
                    settings.EMAIL_HOST_USER,
                    ['owner@gmail.com'],                                       # sender email
                )
                email.fail_silently = False
                email.content_subtype = 'html'       # WITHOUT THIS THE HTML WILL GET RENDERED AS PLAIN TEXT
                email.send()

                return redirect('user')

Все значения, сгенерированные выше, сохраняются в модели, а затем отправляются по электронной почте, что является необходимым.

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

Не так уж много вы можете сделать с синхронным кодом, что вам нужно сделать, так это настроить асинхронное представление Async with Django и создать рабочий для вашей электронной почты.

Идея заключается в том, чтобы все задачи, которые потенциально могут замедлить работу вашего сервера, обернуть в асинхронную задачу. Это используется во многих случаях, в частности в вашем, когда необходимо отправить контракты и электронные письма, но это не должно блокировать соединение или код от выполнения.

Вернуться на верх