📜  Django 注册并登录并确认电子邮件 | Python(1)

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

Django 注册并登录并确认电子邮件 | Python

Django是一个开源Web应用框架,用Python编写。本文将为你介绍如何在Django中实现用户注册、登录和电子邮件确认功能。

用户注册

用户注册功能的实现需要以下步骤:

  1. 创建用户模型
  2. 创建用户注册表单(包括用户名、电子邮件、密码等字段)
  3. 创建用户注册视图函数
  4. 创建用户注册页面模板
  5. 配置URL路由

以下是一个简单的用户模型:

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'),
]
用户登录

用户登录功能的实现需要以下步骤:

  1. 创建用户登录表单(包括用户名或电子邮件和密码字段)
  2. 创建用户登录视图函数
  3. 创建用户登录页面模板
  4. 配置URL路由

创建用户登录表单(使用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'),
]
电子邮件确认

电子邮件确认功能的实现需要以下步骤:

  1. 在settings.py中配置EmailBackend、发送邮件所需的信息和邮件模板
  2. 在用户注册视图函数中发送确认邮件
  3. 创建确认邮件的URL视图函数
  4. 配置URL路由

在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中实现用户注册、登录和电子邮件确认功能。