Подтверждение электронной почты в Джанго - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть веб-приложение в Django.Я попытался использовать токен-генератор для сброса пароля, чтобы создать письмо с подтверждением, оно не активировало письмо.

подходит к проблеме,

  1. Пока пользователь предоставляет электронную почту, он должен проверить, присутствует ли электронная почта в БД (БД будет обновляться с электронными письмами пользователя)
  2. После проверки наличия электронной почты в БД пользователю предлагается создать пароль. 3. После создания пароля пользователь может войти на соответствующую страницу.

Есть ли какое-либо решение?Я пытался и следовал

https://medium.com/@frfahim/django-registration-with-confirmation-email-bb5da011e4ef

Выше сообщение помогло мне отправить электронное письмо, но пользователь не активируется после подтверждения электронного письма, сообщение не соответствует моим требованиям, хотя япопытался проверить, возможна ли проверка электронной почты.

Существует ли какой-либо сторонний модуль для django или какое-либо решение для требований, которые я упомянул.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

У меня есть ответ на вашу первую проблему:

Если вы сбрасываете пароль пользователя на основе PasswordResetView + PasswordResetConfirmView, вы можете сделать следующее:

PasswordResetView отвечает за отправку электронных писем пользователям. Он использует свою собственную форму для ввода электронных писем пользователей -PasswordResetForm. Вы можете создать свою собственную форму и наследовать ее от PasswordResetForm. Например:


class PRForm(PasswordResetForm):
    def clean_email(self):
        email = self.cleaned_data['email']
        if not User.objects.filter(email__iexact=email, is_active=True).exists():
            msg = "There is no user with this email."
            self.add_error('email', msg)
        return email

# User – your user model or any custom model if you have one instead of the default one

этот код не позволяет контроллеру отправлять электронную почту на адрес электронной почты, которого у вас нет в вашей БД.

Затем укажите эту форму в вашем ПРОСМОТРЕ:


class PassResView(RatelimitMixin,  PasswordResetView):
    success_url = 
    from_email = 
    subject_template_name =
    email_template_name =
    success_message = 
    template_name = 
    form_class = PRForm  # here is a custom form
    ratelimit_key = 'ip'
    ratelimit_rate = '10/5m'
    ratelimit_block = True
    ratelimit_method = ('GET', 'POST')

RatelimitMixin не позволит кому-либо перебить вашу БД, запустив ваш BD. Вы можете использовать это или нет - это до вас.

0 голосов
/ 13 мая 2019

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

Модели

class Yourmodel(models.Model):
    first_name = models.CharField(max_length=200)
    second_name = models.CharField(max_length=200)
    email = models.EmailField(max_length=100)

Просмотры

def signup(request):
    User = get_user_model()
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            if Yourmodel.objects.filter(email__iexact=email).count() == 1:
                user = form.save(commit=False)
                user.is_active = False
                user.save()
                current_site = get_current_site(request)
                mail_subject = 'Activate your account.'
                message = render_to_string('email_template.html', {
                            'user': user,
                            'domain': current_site.domain,
                            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                            'token': account_activation_token.make_token(user),
                        })
                to_email = form.cleaned_data.get('email')
                send_mail(mail_subject, message, 'youremail', [to_email])
                return HttpResponse('Please confirm your email address to complete the registration')
     else:
        form = SignupForm()
    return render(request, 'regform.html', {'form': form})

def activate(request, uidb64, token):
    User = get_user_model()
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')

Формы

from django.contrib.auth.forms import UserCreationForm


class SignupForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

Шаблон электронной почты

{% autoescape off %}
Hi ,
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}

regform.html

{% csrf_token %}
{% for field in form %}
<label >{{ field.label_tag }}</label>
{{ field }}
{% endfor %}

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

email = form.cleaned_data.get('email')
if Yourmodel.objects.filter(email__iexact=email).count() == 1:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...