在使用 Django 的认证系统时,如何轻松地为用户注册添加电子邮件确认功能?
2、解决方案
您可以参考 James Bennett's django-registration 项目。
这是一个用于 Django 的第三方应用,它可以轻松地为用户注册添加电子邮件确认功能。
以下是使用 django-registration 来实现电子邮件确认功能的步骤:
- 安装 django-registration 应用:
pip install django-registration
- 在项目的 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/'
- 在项目的 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'),
]
- 在项目的 templates 目录下创建 django-registration 的模板:
registration/registration_form.html
registration/activation_email.html
registration/activation_complete.html
- 在项目的 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,
)
- 在项目的 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)
- 在项目的 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
- 在项目的 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})
- 在项目的 templates 目录下创建电子邮件验证模板:
registration/activation_sent.html
registration/email_verification.html
通过这些步骤,您就可以轻松地为用户注册添加电子邮件确认功能。