Django Rest-Framework JWT认证下更新数据遇user_not_found问题求助
问题分析与解决方案
出现user_not_found错误的核心原因有两点:
- 权限验证的用户匹配问题:
IsAuthenticated权限依赖JWT令牌解析出的request.user,如果令牌对应的用户在数据库中不存在,或是你的Register模型与Django认证系统的用户模型未正确关联,就会触发该错误。 - 业务逻辑冗余且不安全:当前通过请求体中的
phone_number查询记录,既违背了认证权限的设计逻辑(已认证用户应只能修改自身记录),也可能因手机号与当前认证用户不匹配导致冲突。
修复步骤
1. 确认用户模型关联(关键前提)
如果Register是自定义用户模型(继承AbstractUser),必须在项目settings.py中配置:
AUTH_USER_MODEL = '你的应用名.Register'
如果Register是与Django默认User模型关联的扩展模型(比如通过OneToOneField),要确保注册时已为新创建的User绑定对应的Register实例。
2. 重构set_mpin视图
直接使用认证后的request.user获取对应记录,既解决权限验证问题,也保证业务逻辑的安全性:
@api_view(['PUT']) @permission_classes([IsAuthenticated]) def set_mpin(request): # 从认证用户直接获取对应的Register实例 try: # 若Register是自定义用户模型,直接用request.user registered_user = request.user # 若为关联模型,改为:registered_user = request.user.register except Register.DoesNotExist: return Response({'status': 404, 'message': '用户记录未找到'}) serializer = SetMpinSerializer(registered_user, data=request.data) if serializer.is_valid(): serializer.save() return Response({'status':200, 'message':'MPIN设置成功'}) else: return Response({'status':400, 'message':'参数无效', 'errors': serializer.errors})
3. 确保请求正确携带JWT令牌
发起PUT请求时,必须在请求头中添加认证信息:
Authorization: Bearer <你的access_token>
额外优化建议
- 在
SetMpinSerializer中移除phone_number字段(无需再接收,直接从认证用户获取),避免冗余参数。 - 注册时确保
RegisterSerializer正确创建/关联用户模型,保证JWT令牌生成的用户与Register实例一一对应。
内容的提问来源于stack exchange,提问作者Parthasarathi Behera
相关产品推荐
相关产品推荐

