#django #django-views #django-email
#django #django-views #django-email
Вопрос:
Я создаю веб-сайт, на котором пользователь регистрируется, чтобы заказать инструктора на определенный период времени в соответствии с выбранным им планом. Существует три плана, из которых пользователь может выбрать, а именно 7 дней, 14 дней и 21 день. После регистрации пользователю необходимо принять соглашение, а затем на основе выбранного им плана устанавливается дата истечения срока действия со дня, когда пользователь принял соглашение.
Теперь после того, как пользователь принял соглашение, копия соглашения отправляется пользователю, а также владельцам веб-сайта по электронной почте. Владельцы хотят эту систему, в которой копия соглашения получает как пользователь, так и они. Я могу это сделать, и сайт работает нормально на этапе тестирования. Таким образом, по сути, после принятия пользователем отправляются два электронных письма и обновляется модель контракта.
Теперь я заметил, что отправка двух электронных писем занимает много времени, и страница продолжает загружаться до тех пор, пока оба письма не будут отправлены, а затем перенаправляются, и все происходит для пользователя. Это время ожидания может привести к тому, что некоторые пользователи будут нажимать кнопку назад, прерывая 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')
Все сгенерированные выше значения сохраняются в модели, а затем отправляются по электронной почте, которая необходима.
Поскольку я начинающий, я хочу знать, есть ли более эффективный и быстрый способ выполнения всей этой задачи, чтобы пользователю не приходилось так долго ждать своих перенаправлений, и электронные письма также отправляются из серверной части.
Ответ №1:
Вы мало что можете сделать с синхронным кодом, вам нужно настроить асинхронный просмотр асинхронно с Django и создать worker для вашей электронной почты.
Идея состоит в том, чтобы все задачи, которые потенциально могут замедлить работу вашего сервера, были объединены в асинхронную задачу, это используется во многих случаях, и особенно в ваших, когда необходимо отправлять контракты и электронные письма, но это не должно блокировать выполнение соединения или кода.
Комментарии:
1. большое вам спасибо, я проверю документацию
2. Сейчас я начал использовать сельдерей для этой цели
3. Очень хороший выбор, асинхронный вначале трудно понять, но это хороший навык, молодец!