📜  django 电子邮件验证 - Python (1)

📅  最后修改于: 2023-12-03 15:14:44.394000             🧑  作者: Mango

Django 电子邮件验证 - Python

在 Django 中,电子邮件验证是一个非常有用的功能。它允许你验证用户输入的电子邮件地址是否有效,并确保用户输入的电子邮件地址属于他们本人。这样一来,你就可以减少垃圾注册和虚假注册,从而保证你的网站或应用程序的可信度。

如何实现电子邮件验证

要在 Django 中实现电子邮件验证,首先需要安装 Django 的邮件库。你可以使用以下命令进行安装:

pip install django-mail

然后,你需要向 Django 的 settings.py 文件中添加以下配置:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your_gmail_username'
EMAIL_HOST_PASSWORD = 'your_gmail_password'

在添加上述配置后,你需要编写一个视图来处理用户发送的验证请求,并向他们发送验证邮件。

from django.core.mail import send_mail
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.contrib.auth.tokens import default_token_generator
from django.core.exceptions import ValidationError

# Validate Email Address
def validate_email(request):
    if request.method == 'POST':
        email = request.POST['email']
        try:
            User.objects.get(email=email)
        except User.DoesNotExist:
            # Email has not yet been used by any user. Email the user to verify their email address.
            subject = 'Verify your email' # Email Subject
            message = render(request, 'verify_email.html', {
                'user': request.user,
                'uid': urlsafe_base64_encode(force_bytes(request.user.pk)),
                'token': default_token_generator.make_token(request.user),
            })
            send_mail(
                subject,
                message,
                from_email='from@example.com', # Your Email Address
                recipient_list=[email],
                fail_silently=False
            )
            return redirect('validate_email_done')
        else:
            raise ValidationError('Email already used by another user.')
    return render(request, 'validate_email.html')

# Validate Email Done
def validate_email_done(request):
    return render(request, 'validate_email_done.html')

以上代码中,validate_email 视图会检查用户输入的电子邮件地址是否已经被其他用户使用。如果该地址当前没有用户使用,视图将向该邮箱地址发送验证邮件。若电子邮件地址已经被使用,则视图将引发异常。

在渲染验证邮件时,我们使用了 Django 的内置模板系统。你可以创建自己的模板,以便根据你的需求来个性化验证邮件的内容。模板文件我们可以使用以下代码进行编写:

Hello {{ user.username }},

Please click on the link below to verify your email address.

http://{{ request.get_host }}{% url 'validate_email_confirm' uidb64=uid token=token %}

Thank you!

{{ request.get_host }} Team

在用户单击验证邮件中的链接时,它将触发一个新的视图。该视图将接收到解密的 UID,以及验证令牌。然后,它将使用 Django 的 User 模型来根据 UID 查找用户,并使用 default_token_generator 来验证令牌。如果验证通过,该视图将更新用户的电子邮件地址验证状态,并将用户重定向回必要的页面来完成验证流程。

from django.contrib.auth import get_user_model
from django.utils.encoding import force_text
from django.utils.http import urlsafe_base64_decode
from django.contrib.auth.tokens import default_token_generator
from django.shortcuts import render, redirect

def validate_email_confirm(request, uidb64=None, token=None):
    userModel = get_user_model()
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = userModel.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, userModel.DoesNotExist):
        user = None

    if user is not None and default_token_generator.check_token(user, token):
        user.is_email_verified = True
        user.save()
        login(request, user)
        return redirect('home')
    else:
        return render(request, 'validate_email_confirm_invalid.html')

以上代码中的 validate_email_confirm 视图使用 default_token_generator 实例来验证电子邮件地址。如果验证通过,则会更新用户的电子邮件地址验证状态,并将用户重定向到他们想要前往的页面。

结语

现在你已经了解了 Django 中电子邮件验证的实现。电子邮件验证是一个非常实用的功能,它增强了你的网站或应用程序的安全性和可信度。如果你正在使用 Django,那么一定要考虑将它集成到你的项目中。