DRF Использовать сериализатор для проверки тела и сериализации ответа - PullRequest
1 голос
/ 11 ноября 2019

У меня есть следующее представление в django, которое регистрирует пользователя и отправляет ответ после сериализации пользовательских данных с использованием сериализатора.

@api_view(['POST'])
def sign_in(request):
    username = request.data['username']
    password = request.data['password']
    user = authenticate(username=username, password=password)

    if user is not None:
        update_last_login(None, user)  # update the user's last login date
        serializer = UserSignInSerializer(user)
        return Response(serializer.data)

    return Response('Invalid login credentials', status=401)

Что мне не нравится в этом представлении, так это способ извлечения имени пользователя и пароля непосредственно из тела. Я хотел бы использовать тот же сериализатор, чтобы проверить, является ли тело действительным. Возможно ли это, или мне нужно создать новый сериализатор только для проверки запросов? Вот существующий сериализатор:

class UserSignInSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 'username', 'profile']

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете использовать object level validation из каркаса отдыха django. Вот хороший код, который вы можете использовать от django rest auth. Я следую за этим, чтобы дать вам пример здесь:

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField(required=False, allow_blank=True)
    password = serializers.CharField(style={'input_type': 'password'})

    def authenticate(self, **kwargs):
        return authenticate(self.context['request'], **kwargs)

    def _validate_username(self, username, password):
        user = None

        if username and password:
            user = self.authenticate(email=email, password=password)
        else:
            msg = _('Must include "username" and "password".')
            raise exceptions.ValidationError(msg)

        return user

    def validate(self, attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        user = self._validate_username(username, password)
        if user:
            if not user.is_active:
                msg = _('User account is disabled.')
                raise exceptions.ValidationError(msg)
        else:
            msg = _('Unable to log in with provided credentials.')
            raise exceptions.ValidationError(msg)

        attrs['user'] = user
        return attrs

И используйте этот сериализатор в виду:

@api_view(['POST'])
def sign_in(request):
    serializer = LoginSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
        user = serializer.validated_data['user']
        update_last_login(None, user)  # update the user's last login date
        u_serializer = UserSignInSerializer(user)
        return Response(u_serializer.data)

    return Response(serializer.errors, status=401)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...