Django 注册后的电子邮件确认

113 阅读2分钟

在使用 Django 的认证系统时,如何轻松地为用户注册添加电子邮件确认功能?

2、解决方案

您可以参考 James Bennett's django-registration 项目。

这是一个用于 Django 的第三方应用,它可以轻松地为用户注册添加电子邮件确认功能。

以下是使用 django-registration 来实现电子邮件确认功能的步骤:

  1. 安装 django-registration 应用:
pip install django-registration
  1. 在项目的 settings.py 文件中添加 django-registration 的配置:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_registration',
]

# Email verification activation
REGISTRATION_OPEN = True
ACCOUNT_ACTIVATION_DAYS = 7
REGISTRATION_AUTO_LOGIN = True
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/accounts/login/'
  1. 在项目的 urls.py 文件中添加 django-registration 的 URL 配置:
from django.conf.urls import url
from django_registration.backends.activation.views import RegistrationView, ActivationView

urlpatterns = [
    url(r'^accounts/register/$', RegistrationView.as_view(), name='django_registration_register'),
    url(r'^accounts/activate/(?P<activation_key>\w+)/$', ActivationView.as_view(), name='django_registration_activate'),
]
  1. 在项目的 templates 目录下创建 django-registration 的模板:
registration/registration_form.html
registration/activation_email.html
registration/activation_complete.html
  1. 在项目的 views.py 文件中添加电子邮件发送功能:
from django.core.mail import send_mail

def send_activation_email(user):
    activation_key = user.activation_key
    email_subject = 'Account activation'
    email_body = 'Here is the activation link: http://example.com/accounts/activate/{}/'.format(activation_key)

    send_mail(
        email_subject,
        email_body,
        'noreply@example.com',
        [user.email],
        fail_silently=False,
    )
  1. 在项目的 models.py 文件中添加电子邮件字段:
from django.db import models

class User(models.Model):
    email = models.EmailField(max_length=254, unique=True)
    is_active = models.BooleanField(default=False)
  1. 在项目的 forms.py 文件中添加电子邮件验证表单:
from django import forms
from django.contrib.auth.models import User

class EmailVerificationForm(forms.Form):
    email = forms.EmailField(max_length=254, required=True)

    def clean_email(self):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('Email already exists')
        return email
  1. 在项目的 views.py 文件中添加电子邮件验证视图:
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
from .forms import EmailVerificationForm

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            send_activation_email(user)
            return render(request, 'registration/activation_sent.html')
    else:
        form = UserCreationForm()
    return render(request, 'registration/register.html', {'form': form})

def email_verification(request):
    if request.method == 'POST':
        form = EmailVerificationForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            user = User.objects.get(email=email)
            user.is_active = True
            user.save()
            login(request, user)
            return redirect('home')
    else:
        form = EmailVerificationForm()
    return render(request, 'registration/email_verification.html', {'form': form})
  1. 在项目的 templates 目录下创建电子邮件验证模板:
registration/activation_sent.html
registration/email_verification.html

通过这些步骤,您就可以轻松地为用户注册添加电子邮件确认功能。