You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django REST Framework实现用户认证及logged_in_used返回null的问题排查

问题分析与修复方案

嘿,我一眼就看到你代码里的几个关键问题,这就是logged_in_used(应该是打错了,应该是logged_in_user吧?)一直返回null的原因:


1. authenticate函数参数传错了

你现在把get_user.check_password(password)的结果(布尔值True/False)传给了authenticate的password参数,但authenticate需要的是前端传入的原始密码字符串,不是布尔值。而且这个调用逻辑完全是多余的——authenticate本身就会帮你完成「用户名存在性检查+密码匹配验证」的工作。

2. 直接调用User.objects.get()存在崩溃风险

如果用户输入的用户名不存在,User.objects.get(username=username)会直接抛出User.DoesNotExist异常,导致你的接口直接崩溃,连错误提示都返回不了。


修正后的代码示例

from django.contrib.auth import authenticate
from rest_framework import status

if request.method == "POST":
    username = request.data.get('username')
    password = request.data.get('password')
    
    # 直接用前端传入的用户名和密码调用authenticate,一步完成验证
    logged_in_user = authenticate(username=username, password=password)
    
    if logged_in_user is not None:
        # 验证成功,生成token等后续操作
        data_with_token = {
            'token': 'your-generated-jwt-or-session-token',
            'user_info': {
                'id': logged_in_user.id,
                'username': logged_in_user.username
                # 其他需要返回的用户字段
            }
        }
        result = (data_with_token, logged_in_user, status.HTTP_200_OK)
    else:
        # 验证失败(用户名不存在/密码错误),返回错误信息
        result = ({'error': 'Invalid username or password'}, None, status.HTTP_401_UNAUTHORIZED)

额外注意事项

  • 永远不要用User.objects.get()来处理登录验证,改用authenticate可以安全处理「用户名不存在」的情况,不会抛出异常。
  • check_password()是用来单独验证某个用户的密码是否匹配的方法(比如修改密码时),不是用来给authenticate传参的。
  • 验证失败时记得返回401 Unauthorized状态码,前端可以根据这个状态码直接判断登录失败,不用去解析返回内容里的字段。

内容的提问来源于stack exchange,提问作者feldo badix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:57:45