You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建将用户is_active从False改为True的邮箱验证激活函数?

实现邮箱验证激活账户功能

1. 调整注册逻辑,默认设置账户为未激活

用户注册时,创建用户实例需将is_active设为False,随后调用你已有的activateEmail函数发送验证邮件:

from django.contrib.auth.models import User

def register(request):
    if request.method == 'POST':
        # 获取注册表单数据
        first_name = request.POST.get('first_name')
        email = request.POST.get('email')
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # 创建未激活的用户
        user = User.objects.create_user(
            username=username,
            email=email,
            password=password,
            first_name=first_name,
            is_active=False  # 关键:默认标记为未激活状态
        )
        
        # 触发验证邮件发送
        activateEmail(request, user, email, first_name)
        return HttpResponse("注册成功,请查收邮箱完成账户验证")

2. 修改activateEmail函数,生成带安全令牌的激活链接

原邮件中的固定链接无法验证请求合法性,需替换为包含用户唯一标识和安全令牌的动态链接。可以用Django内置的令牌生成工具实现:

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes

# 自定义令牌生成器,基于用户ID、激活状态和时间戳生成哈希
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return str(user.pk) + str(user.is_active) + str(timestamp)

account_activation_token = AccountActivationTokenGenerator()

def activateEmail(request, user, email, first_name):
    # 生成用户ID的base64编码和验证令牌
    uid = urlsafe_base64_encode(force_bytes(user.pk))
    token = account_activation_token.make_token(user)
    
    # 构造激活链接(替换为你的站点域名和对应路由)
    activation_link = f"{SITE_URL}/activate/{uid}/{token}/"
    
    send_mail(
        f"激活你的用户账户,{user.first_name}!",
        f"你好 {user.first_name}!\n请点击下方链接完成注册验证:\n{activation_link}",
        EMAIL_HOST_USER,
        [user.email],
        fail_silently=False,
    )

3. 创建激活视图,修改is_active字段

编写视图函数处理激活请求,验证令牌有效性后将用户的is_active设为True:

from django.shortcuts import redirect
from django.utils.http import urlsafe_base64_decode
from django.utils.encoding import force_str
from django.contrib.auth.models import User
from django.contrib import messages

def activate(request, uidb64, token):
    try:
        # 解码获取用户ID
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    
    # 验证令牌是否有效
    if user is not None and account_activation_token.check_token(user, token):
        # 激活账户
        user.is_active = True
        user.save()
        messages.success(request, "账户已激活!现在可以登录了")
        return redirect('login')  # 跳转到登录页面
    else:
        messages.error(request, "激活链接无效或已过期")
        return redirect('register')  # 跳转到注册页面

4. 配置URL路由

在项目的urls.py中添加激活路由:

from django.urls import path
from .views import activate

urlpatterns = [
    # 其他路由...
    path('activate/<uidb64>/<token>/', activate, name='activate'),
]

用户点击邮件中的链接后,会触发activate视图,验证通过后自动将is_active字段改为True,完成账户激活流程。

内容的提问来源于stack exchange,提问作者distoratione

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:35:27