Django登录视图login_view报list index out of range错误咨询
错误触发原因
list index out of range报错触发在代码username = fact[0]['username']行:User.objects.filter(email=email).values('username')返回的QuerySet具备列表特性,当用户提交的邮箱未在系统用户表中注册时,filter查询没有匹配结果,返回空QuerySet,此时直接访问索引[0]就会触发下标越界错误。
修复方案
- 方案1:先判断查询结果是否存在再取值
使用exists()方法提前判断是否有匹配用户,无匹配时直接返回错误提示,避免访问空列表下标:
if request.method == 'POST': email = request.POST.get('email', '') password = request.POST.get('password', '') cache.set('email', email) fact = User.objects.filter(email=email).values('username') # 增加空校验逻辑 if not fact.exists(): return render(request, '登录页模板路径', {'error_msg': '当前邮箱未注册'}) username = fact[0]['username'] username = username.encode(encoding='UTF-8') password = password.encode(encoding='UTF-8') # 后续校验逻辑
此处同时将request.POST['key']改为request.POST.get('key', ''),避免前端未传递对应字段时触发KeyError报错。
- 方案2:使用
first()方法获取第一条数据first()方法在QuerySet为空时会返回None,不会抛出下标越界错误,只需判断返回值是否为None即可:
fact = User.objects.filter(email=email).values('username').first() if fact is None: return render(request, '登录页模板路径', {'error_msg': '当前邮箱未注册'}) username = fact['username']
额外优化建议
用户登录逻辑建议直接使用Django自带的auth.authenticate(request, username=xxx, password=xxx)方法完成校验,无需手动查询用户和处理密码编码,内置方法会自动处理密码哈希校验、用户存在性判断等逻辑,安全性和稳定性更高。
内容的提问来源于stack exchange,提问作者destro164
相关产品推荐
相关产品推荐

