포스트

비밀번호 변경(PATCH요청)

PATCH요청을 통한 비밀번호 변경을 구현해봤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# serializer.py
from rest_framework import serializers
from .models import User

class ChangePasswordSerializer(serializers.Serializer):
    password = serializers.CharField(max_length=68, min_length=3)
    check_password = serializers.CharField(max_length=68, min_length=3)

    def validate(self, attrs):
        if attrs['password'] != attrs['check_password']:
            raise ValueError
        return attrs

    def update(self, instance, validated_data):
        instance.set_password(validated_data['password'])
        instance.save()
        return instance


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# accounts/views.py
from rest_framework.generics import GenericAPIView
from .serializers import ChangePasswordSerializer

class UpdatePassword(GenericAPIView):

    queryset = User.objects.all()
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = ChangePasswordSerializer
    lookup_field = 'id'
    
    def patch(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.serializer_class(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()


PATCH 메소드 실행.

instance = self.get_object()

  • instance.password : 기존 DB 비밀번호


serializer = self.serializer_class(instance, data=request.data, partial=True)

  • instance.password : 기존 DB 비밀번호
  • 여기서 ChangePasswordSerializer 실행
  • 새로운 비밀번호에 대해서 유효성 검사
  • instance의 password에 새로운 비밀번호 값이 들어가고, 데이터 직렬화


serializer.is_valid(raise_exception=True)

  • instance.password : 기존 DB 비밀번호


self.perform_update(serializer)

  • instance.password : DB 비밀번호 변경완료.
  • 모델 객체 생성

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.