Django注册视图密码校验异常 正确输入仍提示密码不匹配
Django注册视图始终提示密码不匹配问题排查
你现在遇到的问题本质是if password1 == password2这个判断返回了False,不要凭感觉认为两个值一样,先拿实锤数据,直接在两个密码变量赋值完成后、判断相等前加调试输出,看后端实际接收到的值是什么:
# 调试用,排查完可以删掉 print(repr(password1), repr(password2))
90%以上的情况都是下面几个原因导致的判断失败:
- 前端表单的密码输入框
name属性写错:比如第二个密码框的name写成了confirm_password、password,或者不小心带了空格比如name="password2 ",会导致request.POST.get('password2')取到None,和字符串类型的password1比较自然返回False。 - 密码输入框漏写
name属性:表单提交时只会携带带name属性的字段值,漏写的话后端取不到对应值,返回None。 - 输入值带不可见空白字符:比如复制密码时带了末尾空格、全角空格、换行符,肉眼看内容一致,实际字符串不相等,比如
"123456"和"123456 "比较就会判定不相等。
现有代码的其他严重问题
就算你把密码匹配的问题修好,现有逻辑还有几个会导致功能异常/安全风险的点:
- 密码明文存储:直接把用户输入的明文密码存数据库是严重安全漏洞,Django自带密码哈希加密方法,必须用
set_password()处理后再存储。 - 图片字段取值错误:如果是上传头像类的文件字段,不能从
request.POST里取,要从request.FILES里获取,同时前端表单标签必须加enctype="multipart/form-data"属性,否则后端收不到上传的文件。 - 冗余存储确认密码:
confirm_password只是提交时做校验用,不需要在数据库里单独存一份字段。 - 缺少非空校验:如果用户漏填必填字段,直接调用
objects.create会抛出数据库非空约束异常,要提前做判空处理。 - 冗余嵌套判断:多层if else嵌套可读性差,提前return错误分支可以让代码逻辑更清晰。
修正后参考代码
def Guide_register(request): if request.method == 'POST': # 调试用,确认参数没问题后可删除 print("接收的POST参数:", dict(request.POST)) firstname = request.POST.get('first_name', '').strip() lastname = request.POST.get('last_name', '').strip() username = request.POST.get('username', '').strip() email = request.POST.get('email', '').strip() password1 = request.POST.get('password1', '').strip() password2 = request.POST.get('password2', '').strip() image = request.FILES.get('image') city = request.POST.get('city', '').strip() # 必填项校验 if not all([firstname, lastname, username, email, password1, password2, city]): messages.error(request, '请填写所有必填字段') return redirect('guideregister') # 密码匹配校验 if password1 != password2: messages.error(request, 'Password does not match!') return redirect('guideregister') # 用户名重复校验 if Guide_Register.objects.filter(username=username).exists(): messages.error(request,'Username already exists!') return redirect('guideregister') # 邮箱重复校验 if Guide_Register.objects.filter(email=email).exists(): messages.error(request,'Email already exists!') return redirect('guideregister') # 创建用户,密码哈希加密存储 guide = Guide_Register( first_name=firstname, last_name=lastname, username=username, email=email, guide_photo=image, city=city ) guide.set_password(password1) guide.save() messages.success(request,'You are registered successfully as Guide!') return redirect('guidelogin') return render(request,'accounts/guide_register.html')
排查优先看前端表单两个密码框的name属性是不是严格等于
password1和password2,这个是最高发的问题点。
内容的提问来源于stack exchange,提问作者Rishi Gupta
相关产品推荐
相关产品推荐

