[Python] Email verification in django python

Discussão em 'Python' iniciado por Stack, Julho 18, 2025.

  1. Stack

    Stack Membro Participativo

    I try to make email verification in django, everyting works correctly, but if user creates account with someone other's email and if user will not confirm email, owner of this email will not be able to register because account is alredy registered and is_active is False. Here my views.py with reg form '''

    from django.shortcuts import render, redirect
    from django.http.request import HttpRequest
    from django.http import JsonResponse
    from .forms import UserRegisterForm, UserLoginForm
    from .models import User
    from .tokens import accound_activate_token

    from django.contrib.sites.shortcuts import get_current_site
    from django.template.loader import render_to_string
    from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
    from django.utils.encoding import force_bytes, force_str

    from django.core.mail import send_mail

    # from django.contrib.auth.forms import AuthenticationForm
    from django.contrib.auth import authenticate, login, logout

    def send_email_validation(request: HttpRequest, user: User, form: UserRegisterForm):
    current_site = get_current_site(request)
    mail_subject = "Activate your account"
    message = render_to_string(
    "users/emails/email_activation.html",
    {
    "user": user,
    "domain": current_site.domain,
    "uid": urlsafe_base64_encode(force_bytes(user.pk)),
    'token': accound_activate_token.make_token(user)

    }
    )
    from_email = "xxx"
    to_email = form.cleaned_data["email"]
    send_mail(
    mail_subject, message, from_email,
    [to_email]
    )

    def register_page(request: HttpRequest):
    if request.method == "GET":
    reg_form = UserRegisterForm()

    if request.method == "POST":
    reg_form = UserRegisterForm(request.POST)
    # create user and redirect to login
    if reg_form.is_valid():
    user: User = reg_form.save(commit=False)
    user.is_active = False
    user.save()

    # sending email for validation
    send_email_validation(request, user, reg_form)

    return redirect("users_login")
    context = {
    "form": reg_form
    }

    return render(request, "users/register.html", context)

    def activate_email(reqest: HttpRequest, uidb64, token):
    try:
    uid = force_str(urlsafe_base64_decode(uidb64))
    user = User.objects.get(pk=uid)

    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
    user = None

    if user and accound_activate_token.check_token(user, token):
    user.is_active = True
    user.save()
    return redirect("main_page")


    '''

    tokens.py '''

    from django.contrib.auth.tokens import PasswordResetTokenGenerator

    class AccoundActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
    return f"{user.pk}{timestamp}{user.is_active}"

    accound_activate_token = AccoundActivationTokenGenerator()


    '''

    I think I need to save user only after email verified successfully, but I don't know if it will be correct

    Continue reading...

Compartilhe esta Página