You need to enable JavaScript to run this app. Django使用Twilio实现手机号验证激活用户、未验证禁用及报错解决
优惠活动
大模型
产品
解决方案
定价
更多

Django使用Twilio实现手机号验证激活用户、未验证禁用及报错解决

Django集成Twilio实现手机号验证激活账号解决方案

问题根因

运行报错的直接原因是token_validation视图中未定义user变量,注册流程仅将手机号、国家码存入session,没有存储当前注册用户的唯一标识,导致验证通过后无法定位需要激活的用户。

修复步骤

步骤1:修改注册视图,新增用户ID存储

在signupPage视图保存用户后,将用户ID存入session,代码修改如下:

def signupPage(request):
    form = CreateUserForm()
    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            # 新增:存储注册用户ID到session
            request.session['user_id'] = user.id
            request.session['phone'] = form.cleaned_data['phone']
            request.session['country_code'] = form.cleaned_data['country_code']
            authy_api.phones.verification_start(
                form.cleaned_data['phone'],
                form.cleaned_data['country_code'],
            )
            return redirect('token_validation')
    context = {'form': form}
    return render(request, 'user/signup.html', context)

步骤2:修改验证视图,获取用户并激活

在token_validation视图中先从session取用户ID,查询对应用户后再执行激活操作,同时增加异常处理和session清理逻辑,修改后代码如下:

from django.contrib.auth.models import User
from django.shortcuts import redirect

def token_validation(request):
    # 预处理:未携带注册信息直接访问该页面的情况,跳转到注册页
    if not all(key in request.session for key in ['user_id', 'phone', 'country_code']):
        messages.error(request, '请先完成注册信息填写')
        return redirect('signup')
    if request.method == 'POST':
        form = TokenForm(request.POST)
        if form.is_valid():
            verification = authy_api.phones.verification_check(
                request.session['phone'],
                request.session['country_code'],
                form.cleaned_data['token']
            )
            if verification.ok():
                # 从session获取用户ID,查询用户
                try:
                    user = User.objects.get(id=request.session['user_id'])
                except User.DoesNotExist:
                    messages.error(request, '用户信息不存在,请重新注册')
                    # 清理无效session
                    for key in ['user_id', 'phone', 'country_code', 'is_verified']:
                        if key in request.session:
                            del request.session[key]
                    return redirect('signup')
                # 激活用户
                user.is_active = True
                user.save()
                request.session['is_verified'] = True
                messages.info(request, 'Your Phone Number is Verified, Please Enter Your Information.')
                # 清理session中的临时验证数据
                for key in ['user_id', 'phone', 'country_code']:
                    del request.session[key]
                return redirect('verified')
            else:
                for error_msg in verification.errors().values():
                    form.add_error(None, error_msg)
    else:
        form = TokenForm()
    return render(request,'user/token_validation.html', {'form': form})

注意事项

  • 如使用自定义用户模型,请将上述代码中的User替换为你自定义的用户模型
  • 新增的非法访问跳转逻辑可以避免用户直接进入验证页产生的异常
  • 验证完成后清理session中的临时数据,可降低信息泄露风险

内容的提问来源于stack exchange,提问作者Md Inamul Irshad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:09:03