오늘은 문서 작업과 코드 병합 과정에 있어서 많은 기능에 손을 대지는 못했다.
그 중에서 회원 정보 기능에 넣었던 validate 로직에 대한 내용을 써보려고 한다.
class UserAPIView(APIView):
permission_classes = [IsAuthenticated]
def get_user_object(self, username):
return get_object_or_404(User, username=username)
def put(self, request, username):
user = self.get_user_object(username)
if user == request.user:
is_valid, error_message = validator_update_user(request.data, user)
if not is_valid:
return Response({"error": error_message}, status=status.HTTP_400_BAD_REQUEST)
serializer = UserSerializer(user, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response({"message": "수정 권한이 없습니다."}, status=status.HTTP_403_FORBIDDEN)
회원 정보 수정만 가져온 부분이다.
로그인한 유저만 자신의 정보를 수정해야 하니 IsAuthenticated와 로그인한 유저가 url의 요청 주소로 불러온 유저와 같은지 확인하는 부분을 먼저 작성하고 받아온 데이터 검증을 위해서 validator_update_user 함수를 직접 만들었다.
def validator_update_user(update_data, user_data):
err_msg = []
name = update_data.get("name", user_data.name)
if name =="":
err_msg.append({"name": "이름을 입력해야 합니다."})
elif len(name) > 20:
err_msg.append({"name": "이름은 20자 이하여야 합니다."})
email = update_data.get("email", user_data.email)
if email == "":
err_msg.append({"email": "이메일을 입력해야 합니다."})
elif User.objects.filter(email=email).exclude(pk=user_data.pk).exists():
err_msg.append({"email": "이미 존재하는 이메일입니다."})
else:
try:
validate_email(email)
except:
err_msg.append({"email": "이메일 형식이 올바르지 않습니다."})
address = update_data.get("address", user_data.address)
if address == "":
err_msg.append({"address": "주소를 입력해야 합니다."})
return not bool(err_msg), err_msg
validator_update_user의 기능은 그렇게 많지 않다.
회원가입시 검증하는 로직이랑 비슷한데 다른점은 유저의 정보도 같이 가져와 부분만 수정할 수 있게 구현하려고 했다.
request.data 안에 알맞은 key값이 value를 가지고 있지 않다면 원래 유저의 데이터를 채워서 수정하게끔 했다.
이렇게 구현하면서 느낀점은 프론트로 확인할 수 없으니 검증에 불편함이 있지 않을까라는 걱정이 있었다.
postman으로 확인하고 있지만 역시 요청을 할 수 있는 간단한 form을 먼저 만들어서 코드에 대한 실행을 해야할 것 같다.
'웹 개발' 카테고리의 다른 글
[프로젝트] 트러블 슈팅(관리자 페이지) (0) | 2024.10.01 |
---|---|
[프로젝트] API로 호출한 데이터를 받는 방법 (0) | 2024.09.30 |
[프로젝트] 로그인 트러블 슈팅 (0) | 2024.09.26 |
[프로젝트] ERD 수정 및 와이어프레임 작성 (0) | 2024.09.24 |
[프로젝트] 내일 배움 캠프 최종 프로젝트 시작 (2) | 2024.09.24 |