Реализация повторной отправки подтверждения электронной почты Django

Я пытаюсь создать проверку электронной почты для регистрации пользователя с помощью CreateView. Эта проверка просмотра является ли пользователь новым или уже существующим неактивным пользователем? и повторно отправить подтверждение, если пользователь неактивен.

Вот как я это сделал (часть отправки электронной почты),

views.py

class SignUpView(CreateView):
    """ SignUp view """

    form_class = SignUpForm
    success_url = reverse_lazy('login')
    template_name="registration/register.html"

    def send_activation_email(self, request, user):
        """ sends email confirmation email """

        uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
        token = token_generator.make_token(user)

        domain = get_current_site(request).domain
        schema = request.is_secure() and "https" or "http"

        link = reverse('user_activation', kwargs={'uidb64': uidb64, 'token': token})
        url="{}://{}{}".format(schema, domain, link)

        payload = {
            'receiver': user.email,
            'email_body': {
                'username': user.username,
                'email_body': 'Verify your email to finish signing up for RapidReady',
                'link': url,
                'link_text': 'Verify Your Email',
                'email_reason': "You're receiving this email because you signed up in {}".format(domain),
                'site_name': domain
            },
            'email_subject': 'Verify your Email',
        }

        Util.send_email(payload)
        messages.success(request, 'Please Confirm your email to complete registration.')

    def get(self, request, *args, **kwargs):
        """ Prevents authenticated user accessing registration path """

        if request.user.is_authenticated:
            return redirect('home')
        return super(SignUpView, self).get(request, *args, **kwargs)

    def form_valid(self, form):
        """ Handles valid form """

        form = self.form_class(self.request.POST)

        user = form.save(commit=False)
        user.is_active = False
        user.save()

        self.send_activation_email(self.request, user)

        return render(self.request, 'registration/confirm_email.html', {'email': user.email})

    def post(self, request, *args, **kwargs):
        """ Handles existing inactive user registration attempt """

        form = self.form_class(self.request.POST)

        if User.objects.filter(email=request.POST['email']).exists():
            user = User.objects.get(email=request.POST['email'])
            if not user.is_active:
                self.send_activation_email(request, user)

                return render(self.request, 'registration/confirm_email.html', {'email': user.email})
        # if no record found pass to form_valid
        return self.form_valid(form)

util.py

class TokenGenerator(PasswordResetTokenGenerator):

    def _make_hash_value(self, user, timestamp):
        return text_type(user.is_active) + text_type(user.pk) + text_type(timestamp)


token_generator = TokenGenerator()


class EmailThread(threading.Thread):

    def __init__(self, email):
        self.email = email
        threading.Thread.__init__(self)

    def run(self):
        self.email.send()


class Util:
    @staticmethod
    def send_email(data):
        msg_plain = render_to_string('email/email_normal_email.txt', data['email_body'])
        msg_html = render_to_string('email/email_normal_email.html', data['email_body'])

        msg = EmailMultiAlternatives(data['email_subject'], msg_plain, config('EMAIL_HOST_USER'), [data['receiver']])
        msg.attach_alternative(msg_html, "text/html")

        EmailThread(msg).start()

В приведенном выше коде я использовал form_valid() метод обработки регистрация нового пользователя и post() метод, чтобы проверить, является ли пользователь новый или уже зарегистрированный неактивный пользователь.

Если запись не найдена, post() метод вызовет form_valid() метод, передающий форму в качестве аргумента (последняя строка в представлениях). И эта логика прекрасно работает.

Итак, мой главный вопрос: есть ли какие-либо негативные эффекты из-за этой реализации? Будем очень признательны за любые советы (передовой опыт, улучшения и т. д.).

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *