3. 패스워드 변경
serializer에서 유효성 검증을 하는 방법은 2가지가 있다
1. object-level validation
여러 개의 필드에 대해 유효성을 검사해야 하는 경우 validate() 함수를 오버라이딩 하여 사용할 수 있다
2. field-level validation
validate_<field_name> 함수를 사용하여 개별 필드에 대한 유효성 검사를 할 수 있다. 이 경우에 필드 네임이 시리얼라이저에 파라미터로 선언되어있지만 required = False인 경우에는 유효성 검사가 동작하지 않을 수 있다.
패스워드 변경 시에 3개의 변수를 입력받는데,
새로운 패스워드, 패스워드 확인, 기존 패스워드를 입력받는다
이때
1. 새로운 패스워드와 패스워드 확인이 일치 할 것
2. 새로운 패스워드가 기존 패스워드와 다를 것
3. 기존 패스워드가 올바르게 입력되어야 할 것
위의 세 가지 조건을 모두 만족한다면 패스워드가 변경되어야 했다.
1,2번 조건은 object-level validation을 사용하여 코드를 작성하였다
def validate(self, attrs):
# 변경 패스워드 확인 절차
if attrs["new_password"] != attrs["confirm_password"]:
raise serializers.ValidationError(
{"password": "패스워드가 일치하지 않습니다"}
)
# 기존 패스워드와 변경할 패스워드는 상이해야 함
if attrs["new_password"] == attrs["old_password"]:
raise serializers.ValidationError(
{"password": "기존 패스워드와 동일합니다."}
)
return attrs
그리고 위의 코드는 문제없이 정상적으로 동작하는 것을 확인했다.
문제는 3번 조건에서 발생하였다
패스워드 변경 시에 serializers.py에서 작성한 validate가 제대로 동작하지 않았다
기존 비밀번호가 일치하지 않음에도 비밀번호가 변경되었다.
def validate_old_password(self, value):
me = self.context
if not me.check_password(value):
raise serializers.ValidationError("기존 패스워드가 일치하지 않습니다.")
return value
serializer에서 위와 같이 작성해주었지만
me를 프린트 해 주었을때 빈 값이 전달되는 것을 확인 할 수 있었고
값을 전달해주기 위해 view의 serializer를 사용한 부분에서 context로 유저의 정보를 넘겨주었다
class ChangePasswordView(APIView):
permission_classes = [IsAuthenticated]
def put(self, request):
me = get_user_model().objects.get(id=request.user.id)
serializer = ChangePasswordSerializer(
instance=me, data=request.data, context=me
) # serializer에서 유효성 검증을 위해 context로 로그인한 유저의 정보를 전달해줌
if serializer.is_valid():
serializer.save()
return Response(
{"password": "비밀번호가 변경되었습니다."}, status=status.HTTP_200_OK
)
return Response(serializer.errors)
'[내일배움캠프]스파르타코딩클럽 AI 웹개발 > Today I Learned' 카테고리의 다른 글
[TIL] trouble shooting - serializer.data (0) | 2024.09.12 |
---|---|
[TIL] project setting (0) | 2024.09.11 |
[TIL] spartamarket-DRF 트러블 슈팅 (0) | 2024.09.09 |
[TIL] 권한 있는 사용자 (1) | 2024.09.09 |
[TIL] TokenBlacklistView - Method \POST\ not allowed (0) | 2024.09.05 |