Django账号删除功能异常:输入随机确认字符串始终不匹配
Django账号删除验证失败问题解决
核心问题
问题根源在于每次请求settings视图时都会重新生成confirmation随机字符串:
- 用户通过GET请求加载页面时,生成一个字符串并传给模板显示;
- 用户提交POST请求时,视图会再次生成全新的字符串,此时拿新字符串和用户输入的旧字符串对比,自然永远不相等。
解决方案
利用Django的session存储随机字符串,session可在同一用户会话的多次请求间保留数据,具体修改如下:
修改views.py
@login_required def settings(request): if request.method == 'POST': form = NewDeleteForm(request.POST) if form.is_valid(): # 从session取出之前存储的验证字符串 stored_confirmation = request.session.get('account_delete_confirmation') if form.cleaned_data["confirmation"] == stored_confirmation: User.objects.filter(username=request.user.get_username()).update(is_active=False) # 验证通过后删除session中的字符串,避免重复使用 del request.session['account_delete_confirmation'] return redirect("home") else: # 给表单添加错误提示,替代直接重定向 form.add_error('confirmation', '输入的验证字符串不匹配') else: form = NewDeleteForm() # 仅在首次加载页面时生成随机字符串并存入session confirmation = ''.join(random.choices(string.ascii_uppercase, k=7)) request.session['account_delete_confirmation'] = confirmation context = { 'home_act': 'active', 'contact_act': '', 'released_act': '', 'about_act': '', 'current_act': '', 'form': form, 'confirmation': request.session.get('account_delete_confirmation', ''), } return render(request, 'turtles/settings.html', context)
可选优化:表单自动统一大小写
如果担心用户输入小写字母导致不匹配,可在forms.py中添加clean方法自动转换为大写:
class NewDeleteForm(forms.Form): confirmation = forms.CharField(label='Type the letters above to confirm account deletion.') def clean_confirmation(self): # 将输入内容统一转为大写,匹配生成的字符串格式 return self.cleaned_data['confirmation'].upper()
内容的提问来源于stack exchange,提问作者Henbeast
相关产品推荐
相关产品推荐

