使用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
相关产品推荐
相关产品推荐

