Как отправить электронное письмо для сброса пароля Django с помощью Celery (без стороннего пакета)? - PullRequest
0 голосов
/ 15 января 2019

Прежде всего, я знаю, что на этот вопрос уже был дан ответ здесь , который использует сторонний пакет django-celery-email , но я пытаюсь выяснить, как это сделать выполнять такую ​​работу, не переходя ни на какую стороннюю библиотеку.

Поэтому мне нужно асинхронно отправлять электронную почту для сброса пароля с Celery .

Мой forms.py файл выглядит так:

from django import forms
from accounts.tasks import send_mail
from django.contrib.auth.forms import PasswordResetForm as PasswordResetFormCore


class PasswordResetForm(PasswordResetFormCore):
    email = forms.EmailField(max_length=254, widget=forms.TextInput(
        attrs={
            'class': 'form-control',
            'id': 'email',
            'placeholder': 'Email'
        }
    ))

    def send_mail(self, subject_template_name, email_template_name,
                  context, from_email, to_email, html_email_template_name=None):
        """
        This method is inherating Django's core `send_mail` method from `PasswordResetForm` class
        """
        super().send_mail(subject_template_name, email_template_name,
                  context, from_email, to_email, html_email_template_name)

Я пытаюсь отправить почту через Сельдерей из send_mail метода PasswordResetForm класса. Я имею в виду звонить super().send_mail(...) с Сельдереем . У меня также есть функция send_mail в моем файле Celery tasks.py, где я пытаюсь передать метод super().send_mail в качестве аргумента для его вызова оттуда.

Прямо сейчас мой tasks.py файл выглядит примерно так:

from __future__ import absolute_import, unicode_literals


@shared_task
def send_mail():
    pass

Я использую RabbitMQ в качестве посредника сообщений наряду с Celery

1 Ответ

0 голосов
/ 15 января 2019

Хорошо, я наткнулся на рабочее решение для этого.Вот мое решение.

Я изменил forms.py, как следует

from django import forms
from accounts.tasks import send_mail
from django.contrib.auth.forms import PasswordResetForm as PasswordResetFormCore


class PasswordResetForm(PasswordResetFormCore):
    email = forms.EmailField(max_length=254, widget=forms.TextInput(
        attrs={
            'class': 'form-control',
            'id': 'email',
            'placeholder': 'Email'
        }
    ))

    def send_mail(self, subject_template_name, email_template_name, context, 
                  from_email, to_email, html_email_template_name=None):
        context['user'] = context['user'].id

        send_mail.delay(subject_template_name=subject_template_name, 
                        email_template_name=email_template_name,
                        context=context, from_email=from_email, to_email=to_email,
                        html_email_template_name=html_email_template_name)

И изменение tasks.py похоже на следующее

from __future__ import absolute_import, unicode_literals
from accounts.models import User
from django.contrib.auth.forms import PasswordResetForm


@shared_task
def send_mail(subject_template_name, email_template_name, context,
              from_email, to_email, html_email_template_name):
    context['user'] = User.objects.get(pk=context['user'])

    PasswordResetForm.send_mail(
        None,
        subject_template_name,
        email_template_name,
        context,
        from_email,
        to_email,
        html_email_template_name
    )
...