📅  最后修改于: 2023-12-03 14:40:47.485000             🧑  作者: Mango
Django是一个开源Web应用框架,用Python编写。本文将为你介绍如何在Django中实现用户注册、登录和电子邮件确认功能。
用户注册功能的实现需要以下步骤:
以下是一个简单的用户模型:
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
pass
创建用户注册表单(使用Django的内置表单):
from django.contrib.auth.forms import UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ['username', 'email']
创建用户注册视图函数:
from django.shortcuts import render, redirect
from .forms import CustomUserCreationForm
def signup(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
# 注意:这里需要发送确认邮件
return redirect('login')
else:
form = CustomUserCreationForm()
return render(request, 'registration/signup.html', {'form': form})
创建用户注册页面模板:
{% extends 'base.html' %}
{% block content %}
<h2>Sign up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign up</button>
</form>
{% endblock %}
配置URL路由:
from django.urls import path
from .views import signup
urlpatterns = [
path('signup/', signup, name='signup'),
]
用户登录功能的实现需要以下步骤:
创建用户登录表单(使用Django的内置表单):
from django.contrib.auth.forms import AuthenticationForm
class CustomAuthenticationForm(AuthenticationForm):
"""
Override standard Django AuthenticationForm to remove the 'username' label and
change it to 'Email Address'.
"""
username = forms.EmailField(label='Email address', widget=forms.EmailInput(attrs={'autofocus': True}))
创建用户登录视图函数:
from django.contrib.auth.views import LoginView
from .forms import CustomAuthenticationForm
class CustomLoginView(LoginView):
authentication_form = CustomAuthenticationForm
template_name = 'registration/login.html'
创建用户登录页面模板:
{% extends 'base.html' %}
{% block content %}
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Log in</button>
</form>
{% endblock %}
配置URL路由:
from django.urls import path
from .views import CustomLoginView
urlpatterns = [
path('login/', CustomLoginView.as_view(), name='login'),
]
电子邮件确认功能的实现需要以下步骤:
在settings.py中配置EmailBackend,根据需要修改EMAIL_BACKEND、EMAIL_HOST、EMAIL_PORT、EMAIL_USE_TLS、EMAIL_HOST_USER和EMAIL_HOST_PASSWORD等参数:
# 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@gmail.com'
EMAIL_HOST_PASSWORD = 'your-gmail-password'
定义邮件模板(email/email_confirmation.html和email/email_confirmation_subject.txt):
<!-- email/email_confirmation.html -->
<h3>Hello {{ user.username }},</h3>
<p>Please click the following link to confirm your email address:</p>
<a href="{{ confirmation_url }}">{{ confirmation_url }}</a>
# email/email_confirmation_subject.txt
Confirm your email address
在用户注册视图函数中发送确认邮件,并将确认码保存到用户模型:
from django.conf import settings
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_text
from django.contrib.sites.shortcuts import get_current_site
from django.urls import reverse
from .tokens import email_confirmation_token_generator
from .forms import CustomUserCreationForm
def signup(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
subject = 'Confirm your email address'
context = {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': email_confirmation_token_generator.make_token(user),
}
message = render_to_string('email/email_confirmation.html', context)
sender = settings.EMAIL_HOST_USER
recipient = form.cleaned_data.get('email')
send_mail(
subject=subject,
message=message,
from_email=sender,
recipient_list=[recipient],
fail_silently=True,
)
return redirect('login')
else:
form = CustomUserCreationForm()
return render(request, 'registration/signup.html', {'form': form})
创建确认邮件的URL视图函数:
from django.urls import reverse
from django.shortcuts import redirect, render
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.contrib import messages
from .tokens import email_confirmation_token_generator
UserModel = get_user_model()
def email_confirmation(request, uidb64, token):
try:
uid = urlsafe_base64_decode(uidb64).decode()
user = UserModel.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist):
user = None
if user and email_confirmation_token_generator.check_token(user, token):
user.is_active = True
user.save()
messages.success(request, 'Your email has been verified. You can login now.')
return redirect('login')
else:
messages.error(request, 'The confirmation link was invalid, possibly because it has already been used.')
return redirect('signup')
配置URL路由:
from django.urls import path
from .views import signup, email_confirmation
urlpatterns = [
path('signup/', signup, name='signup'),
path('email_confirmation/<str:uidb64>/<str:token>/', email_confirmation, name='email_confirmation'),
]
到此为止,你已经完成了在Django中实现用户注册、登录和电子邮件确认功能。