Django REST Framework - 如何从 PUT 和 PATCH 加密密码?

vix*_*ant 2 encryption django rest http django-rest-framework

目前,我 PUT 或 PATCH 的任何密码都不会被加密。

我正在使用 ModelSerializer。

class UserSerializer (serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'pk')
Run Code Online (Sandbox Code Playgroud)

使用 ModelViewSet

class UserViewSet (ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)

为什么我的密码以纯文本格式保存?我该如何解决这个问题?

我应该覆盖serialiser中的update()还是ViewSet中的update()?问题出在哪里?

Mad*_*di7 5

您应该覆盖createupdate方法serializers以使加密成为可能:

from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        user = User.objects.create_user(
            password=make_password(
                validated_data['user'].pop('password')
            ),
            **validated_data.pop('user')
        )

    def update(self, instance, validated_data):
        if 'user' in validated_data:
            instance.user.password = make_password(
                validated_data.get('user').get('password', instance.user.password)
            )
            instance.user.save()

    class Meta:
        model = User
        fields = (
            'url', 'username', 'email', 'pk'
        )
Run Code Online (Sandbox Code Playgroud)