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
相关产品推荐
相关产品推荐

