# 유저 정보 수정 기능 추가
저번에 까먹고 안만든 유저 수정 기능을 할 차례이다.
비밀번호는 따로 암호화를 해줘야하기에 비밀번호 빼고 다른 정보들만 수정 가능하게 만들었다.
# serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields=['id', 'username','nickname', 'email', 'gender', 'age']
gender_list = (
('남', '남'),
('여', '여')
)
username = serializers.CharField(max_length=20) # 아이디
email = serializers.EmailField()
nickname = serializers.CharField(max_length=20) # 이름
gender = serializers.ChoiceField(
choices=gender_list
)
age = serializers.IntegerField()
# views.py
class UserUpdateView(UpdateAPIView):
def get(self, request, format=None):
if request.user.is_authenticated:
serializer = UserSerializer(request.user)
return Response(serializer.data)
return Response({'message': '로그인 후 이용 가능합니다.'}, status=status.HTTP_400_BAD_REQUEST)
def patch(self, request, format=None):
serializer = UserSerializer(request.user, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response({'message': '유저 변경 성공.', 'data': serializer.validated_data}, status=status.HTTP_200_OK)
return Response({'message': '유저 변경 실패.', 'data': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
만들고 생각났는데 get 메서드는 로그인 함수 만들때 만들어줘서 필요없다...
그래도 만든건 지우지 않았다.
patch() 메소드를 사용하고, partial=True를 이용하여 data가 다 들어오지 않아도 되도록 만들었다.
이 함수를 웹브라우저에서 사용하면 'anonymoususer' object has no attribute ~ 이런 오류가 뜰 수 있다. 장고는 로그인하지 않으면 anonymoususer라고 처리를 해버리기 때문에...
근데 따로 로그인하기도 어려움. 그냥 플랫폼을 이용하면 잘된다.
# 비밀번호 수정 기능
비밀번호는
- 현재 로그인된 상태(토큰 받기)
- 현재비밀번호와 새로운 비밀번호 모두 받기
- 현재비밀번호가 틀릴 경우 error
를 바탕으로 제작했다.
# serializers.py
class PasswordUpdateSerializer(serializers.Serializer):
current_password = serializers.CharField(max_length=128, write_only=True)
new_password = serializers.CharField(max_length=128, write_only=True)
# views.py
class PasswordUpdateView(APIView):
serializer_class = PasswordUpdateSerializer
def patch(self, request, format=None):
serializer = PasswordUpdateSerializer(data=request.data)
if serializer.is_valid():
user = request.user
current_password = serializer.validated_data['current_password']
new_password = serializer.validated_data['new_password']
# 현재 비밀번호 확인
if not user.check_password(current_password):
return Response({'message': '현재 비밀번호가 옳지 않습니다.'}, status=HTTP_400_BAD_REQUEST)
# 새로운 비밀번호 설정
user.set_password(new_password)
user.save()
return Response({'message': '비밀번호가 성공적으로 변경되었습니다.'}, status=status.HTTP_200_OK)
else:
return Response({'message': '올바르지 않은 데이터입니다.'}, status=status.HTTP_400_BAD_REQUEST)
check_password() 메서드를 이용하면 알아서 입력받은 비밀번호를 암호화해서 비교하고 T/F를 return한다.
비밀번호가 맞다면 set_password()로 설정 후 return
# API명세서 작성
API명세서 작성...플랫폼에 익숙해지면 편하다.
나는 postman을 작성하는데, 각 API별로 여러 return과 error 상황을 정리할 수 있다.
또, 매번 귀찮게 입력데이터를 입력해주지 않아도 이전에 사용한 것을 정리할 수 있다.(+토큰까지)
저렇게 만들어진 API명세서는 share가 가능하므로 팀원들에게 전달하면 된다.
익숙하지 않다면 Notion에 작성하기.
난 postman을 자주 사용하지만 팀원들이 익숙하지 않은 경우가 있고 한번에 확인하려면 Notion에다가 작성하는 것이 편하긴 하다.
메소드 페이지를 열어서 성공/실패 예시와 데이터 타입 및 예시, 조건 등을 적어준다.
# 회고
만드는 것에서 끝나지 않아...API명세서가 더 힘든 것 같음
'졸업 프로젝트' 카테고리의 다른 글
게시판 댓글 기능 (0) | 2024.02.03 |
---|---|
게시판 기능 (0) | 2024.02.02 |
[Django] Direct assignment to the forward side of a many-to-many set is prohibited. Use groups.set() instead. (0) | 2024.01.31 |
Django 기초 + 유저 기능 만들기 (1) | 2024.01.28 |
졸업 프로젝트 기술 스택 + Django 초기 셋팅하기 (0) | 2023.11.24 |