如何从Django models中查询匹配POST参数的特定记录?
你写的candidate.objects.get(email=request.POST['emails'], password=request.POST['passwd'])本身就完全对应你要的MySQL select * from table where email = someemail and pass = somepasswd 逻辑,语法没有问题,查询不生效可以从以下场景排查调整:
- 先校验参数传递是否正确:
确认前端登录表单中,邮箱输入框的name属性是emails、密码输入框的name属性是passwd,身份单选按钮提交的值精确等于Candidate(注意大小写、前后空格,任意不匹配都会导致不会进入查询分支) - 确认密码存储格式:
如果你在用户注册逻辑中对密码做了哈希加密(比如用了Django自带的make_password方法),直接拿POST提交的明文密码去匹配哈希后的存储值肯定会查询失败。这种情况下正确的逻辑是先按邮箱查询用户,再校验密码:# 替换原来的get查询逻辑 try: udetails = candidate.objects.get(email=request.POST['emails']) except candidate.DoesNotExist: messages.error(request,'邮箱或密码错误') return render(request,'login.html') # 校验密码,如果你是用Django默认加密的话 if not udetails.check_password(request.POST['passwd']): messages.error(request,'邮箱或密码错误') return render(request,'login.html') - 优化异常捕获定位问题:
你现在的全局except会吞掉所有错误,没法区分是查询不到匹配记录、还是POST参数不存在、还是其他逻辑错误,建议调整异常捕获逻辑打印报错:except Exception as e: print("登录报错详情:", e) # 开发阶段可以直接在控制台看具体错误类型 messages.error(request,'login failed...') return render(request,'login.html') - 如果你需要兼容可能存在的重复数据场景(虽然email是主键不会重复),也可以用filter写法实现同样的查询逻辑:
udetails = candidate.objects.filter(email=request.POST['emails'], password=request.POST['passwd']).first() if not udetails: # 匹配不到记录的逻辑 messages.error(request,'登录失败') return render(request,'login.html')
安全提示:不要明文存储用户密码,也不要把明文密码直接放到查询条件中,先按唯一索引(邮箱)查询用户再校验密码的方式可以避免时序攻击风险。
内容的提问来源于stack exchange,提问作者Ashwin Behera
相关产品推荐
相关产品推荐

