Django Rest Framework自定义用户及自定义认证Token实现问题求助
问题1:用户创建时密码未正确存储
你的序列化器create方法里,从validated_data中提取了password字段但没有用到,创建用户时直接写死password=None,所有新建用户的密码都为空,自然无法通过认证。另外Django的AbstractUser不能直接用objects.create存储密码,该方法会直接存储明文,必须调用create_user方法自动对密码做哈希处理,否则存储的密码也无法通过校验。
修改后的序列化器create方法参考:
def create(self, validated_data): User = get_user_model() # 无需逐个提取字段,直接解包validated_data即可 return User.objects.create_user(**validated_data)
如果需要保留单独赋值的写法,要手动调用set_password处理密码:
def create(self, validated_data): User = get_user_model() employee = validated_data.pop('Employee') password = validated_data.pop('password') user = User.objects.create( Employee=employee, **validated_data ) user.set_password(password) user.save() return user
问题2:视图代码存在模型名拼写错误
GET接口中写的是users = Users.objects.all(),你的自定义用户模型类名是User,多了一个s,会直接触发运行时错误,影响接口正常返回。
问题3:缺少必要的配置校验
先确认settings.py里已经完成以下配置:
- 声明自定义用户模型
AUTH_USER_MODEL = "你的应用名称.User"
- 配置DRF Token认证相关依赖
INSTALLED_APPS = [ # 其他应用 'rest_framework', 'rest_framework.authtoken', ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', ] }
问题4:认证接口400的定位方法
你当前的日志没有输出具体错误信息,可以修改自定义认证类打印错误详情,快速定位问题:
class CustomAuthToken(ObtainAuthToken): def post(self, request, *args, **kwargs): serializer = self.serializer_class(data=request.data, context={'request': request}) if not serializer.is_valid(): print(serializer.errors) # 控制台会输出具体错误,比如用户名或密码不正确 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) user = serializer.validated_data['user'] token, created = Token.objects.get_or_create(user=user) return Response({ 'token': token.key, 'user_id': user.pk, 'first_name': user.first_name, 'email': user.email })
你当前场景下90%的概率400错误是因为用户密码为空,校验失败返回的错误。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

