欢迎访问宙启技术站
智能推送

Django.contrib.auth.mixins实现用户账户激活与邮箱验证

发布时间:2023-12-28 01:18:24

Django.contrib.auth.mixins是Django框架中的一个模块,其中包含了一些用于用户认证的类和混合器(mixins)。其中有一个非常常用的混合器——LoginRequiredMixin,用于判断用户是否登录,如果未登录则跳转到登录页面。

在实现用户账户激活与邮箱验证的功能时,我们可以结合使用Django内置的认证系统和这个混合器来实现。

首先,我们需要创建一个公共的基础视图类,命名为BaseView,并继承自LoginRequiredMixin。在这个基础视图类中,我们可以定义一些公共方法和属性,供其他视图类继承使用。

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View

class BaseView(LoginRequiredMixin, View):
    login_url = '/login/'

接下来,我们需要创建一个用户激活视图类,命名为ActivateAccountView,并继承自BaseView。在这个视图类中,我们可以处理账户激活的逻辑。

from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import default_token_generator
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import View

from .models import EmailVerificationToken

class ActivateAccountView(BaseView):
    def get(self, request, *args, **kwargs):
        token = kwargs.get('token')
        user_email = kwargs.get('email')
        
        # 验证 token 是否有效
        try:
            email_verification = EmailVerificationToken.objects.get(token=token, user__email=user_email)
        except EmailVerificationToken.DoesNotExist:
            return redirect('/error/')
        
        # 验证通过,激活账户
        user = email_verification.user
        user.is_active = True
        user.save()
        
        # 删除 token
        email_verification.delete()
        
        return redirect(reverse('account_activated'))

在这个视图类中,我们首先获取到传递过来的token和email参数。然后,我们通过EmailVerificationToken模型类来验证token是否有效。如果token无效,则重定向到错误页面。如果token有效,则激活账户并删除对应的token。

下一步,我们需要创建邮箱验证视图类,命名为SendVerificationEmailView,并继承自BaseView。这个视图类负责处理发送包含验证链接的邮件。

from django.contrib.auth.tokens import default_token_generator
from django.core.mail import send_mail
from django.shortcuts import redirect
from django.urls import reverse
from django.views.generic import View

from .models import EmailVerificationToken

class SendVerificationEmailView(BaseView):
    def get(self, request, *args, **kwargs):
        # 获取当前用户的邮箱
        user_email = request.user.email
        
        # 生成验证 token
        token = default_token_generator.make_token(request.user)
        
        # 创建 EmailVerificationToken 对象
        email_verification = EmailVerificationToken.objects.create(token=token, user=request.user)
        
        # 构建验证链接
        verification_link = request.build_absolute_uri(reverse('account_activate', kwargs={'token': token, 'email': user_email}))
        
        # 发送验证邮件
        send_mail(
            '账户验证',
            f'请点击以下链接完成账户验证:{verification_link}',
            'noreply@mywebsite.com',
            [user_email],
            fail_silently=False,
        )
        
        return redirect(reverse('verification_email_sent'))

在这个视图类中,我们首先获取当前用户的邮箱。然后,我们生成一个验证token,并创建EmailVerificationToken对象。接下来,我们构建验证链接并发送验证邮件。

最后,我们需要创建一个账户已激活视图类,命名为AccountActivatedView,并继承自BaseView。这个视图类负责显示账户已激活的页面。

from django.views.generic import TemplateView

class AccountActivatedView(BaseView, TemplateView):
    template_name = 'account_activated.html'

在这个视图类中,我们只需要指定需要渲染的模板即可。

以上就是一个简单的实现用户账户激活与邮箱验证的例子。通过继承Django内置的混合器LoginRequiredMixin和自定义的BaseView类,我们可以很方便地实现一些共用功能的视图类。同时,通过结合使用Django的认证系统和模型类,我们可以实现用户账户激活与邮箱验证的功能。