Django 1.11用户认证后获取user值为None报错求助
Django 1.11 登录时user为None的排查方案
嘿,我之前在Django 1.11开发登录功能时也踩过这个坑,user返回None直接触发报错,太闹心了!咱们从几个最常见的原因开始排查:
检查
authenticate方法的调用是否正确
Django 1.11里的authenticate方法必须把request作为第一个参数传入,很多人会漏掉这一点,导致验证失败返回None。正确的写法应该是这样:from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': # 从POST请求里获取表单数据 username = request.POST.get('username') password = request.POST.get('password') # 务必传入request! user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('你的首页路由') else: # 验证失败返回错误提示 return render(request, 'login.html', {'error': '用户名或密码错误'}) return render(request, 'login.html')如果没传
request,即便用户名密码正确,也可能返回None。确认前端表单的name属性是否匹配
前端输入框的name属性必须和视图里获取的字段一致,比如用户名输入框的name得是username,密码是password,不然request.POST.get()拿不到值,authenticate自然返回None。举个正确的表单示例:<form method="post"> {% csrf_token %} <input type="text" name="username" placeholder="请输入用户名"> <input type="password" name="password" placeholder="请输入密码"> <button type="submit">登录</button> </form>检查用户账号状态
Django的authenticate方法默认会过滤掉is_active=False的用户,如果你的测试账号被禁用了,就会返回None。可以在Django shell里验证一下:from django.contrib.auth.models import User user = User.objects.get(username='你的测试用户名') print(user.is_active) # 返回False的话,改成True再试自定义认证后端的问题(如果有)
如果你在settings.py里配置了自定义的AUTHENTICATION_BACKENDS,一定要确保后端的authenticate方法逻辑正确,能在验证通过时返回有效的User对象,否则也会导致user为None。
先从这几个点排查,大概率能找到问题所在!
内容的提问来源于stack exchange,提问作者tamurfirat.py
相关产品推荐
相关产品推荐

