【问题标题】:Invalid username/password error django rest framework custom user serializer无效的用户名/密码错误 django rest 框架自定义用户序列化程序
【发布时间】:2018-12-10 13:27:51
【问题描述】:

自定义用户模型:

class User(AbstractUser):
    ROLE_CHOICES = (
         ('R', 'rider'),
         ('D', 'driver'),
    )
    role = models.CharField(max_length=1, choices=ROLE_CHOICES)
    phone_number = models.CharField(max_length=10)
    cab = models.OneToOneField('Cab', on_delete=models.CASCADE, blank=True, null=True)

Rider 序列化器:

class RiderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'phone_number', 'password')
        extra_kwargs = {
            'password': {'write_only': True}
        }
        def create(self, validated_data):
            username = validated_data.pop('username')
            password = validated_data.pop('password')
            instance = User(username, **validated_data)
            if password is not None:
               instance.set_password(password)
               instance.save()
            return instance

基于 Rider 函数的视图方法:

@api_view(['GET', 'POST'])
def rider_list(request):
    if request.method == 'GET':
        riders = User.objects.filter(role='R')
        serializer = RiderSerializer(riders, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = RiderSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save(role='R')
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

骑手端点:/riders/

我能够创建一个用户对象,但用户身份验证失败,因为密码以纯文本形式存储在对象中。

我尝试使用 User.objects.create_user(username, password=password, **validated_data) 将密码设置为哈希值,但它不起作用

我也尝试过使用 make_password 方法设置散列密码,但似乎没有任何效果。

请告诉我我错过了什么。如何将散列密码存储在自定义用户对象的密码字段中。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    create() 方法应该是序列化程序类的一部分,而不是 Meta 的一部分:

    class RiderSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'username', 'email', 'phone_number', 'password')
            extra_kwargs = {
                'password': {'write_only': True}
            }
    
        def create(self, validated_data):
            password = validated_data.pop('password')
            instance = User(**validated_data)
            if password is not None:
               instance.set_password(password)
               instance.save()
            return instance
    

    您也不需要弹出username 字段。只需弹出密码并在set_password 方法中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2017-02-26
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多