Есть ли более быстрый и эффективный способ отправки электронной почты в 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 и создать рабочий для вашей электронной почты.
Идея заключается в том, чтобы все задачи, которые потенциально могут замедлить работу вашего сервера, обернуть в асинхронную задачу. Это используется во многих случаях, в частности в вашем, когда необходимо отправить контракты и электронные письма, но это не должно блокировать соединение или код от выполнения.