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

#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. Очень хороший выбор, асинхронный вначале трудно понять, но это хороший навык, молодец!