[Django] POST API 분석, APIView

서재환·2022년 9월 6일
0

Django

목록 보기
26/40

class 분석

from rest_framework import permissions, status
from rest_framework.response import Response
from drf_yasg.utils import swagger_auto_schema


class ChangeProfileImgView(APIView):
    """
    프로필 이미지 변경

    ---
    """

    permission_classes = (permissions.IsAuthenticated,)

    @swagger_auto_schema(
        request_body=MemeberProfileImgChangeSerializer,
        responses={200: MemberSerializer},
    )
    def post(self, request):
        serializer = MemeberProfileImgChangeSerializer(data=request.data)

        if not serializer.is_valid():
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        profile_img = serializer.validated_data["profile_img"]
        member = request.user
        member.profile_img = profile_img
        member.save()
        res = MemberSerializer(member).data

        return Response(res)

MemeberProfileImgChangeSerializer 이해

MemeberProfileImgChangeSerializer(serializers.py)

apps -> member -> serializers.py에 적혀있는 일반 직렬 변환기로 작성되어 있다. 이렇게 Member의 필드 일부분에 해당하는 serializer를 작성해줌으로써 POST 요청을 보낼 때 특정 model의 특정 field를 수정할 수 있다.

해당 serializer의 생김새는 아래와 같다.

class MemeberProfileImgChangeSerializer(serializers.Serializer):
    profile_img = serializers.CharField(
        max_length=500, allow_blank=True, allow_null=True
    )

swagger

swagger에서 request_body부문에 작성된 serializer가 swagger 페이지에서 어디에 나타나는지 보자.

@swagger_auto_schema(
        request_body=MemeberProfileImgChangeSerializer,
        responses={200: MemberSerializer},
    )

swagger에 request_body에 serializer를 적을 경우 해당 부문이 적용된 화면

  • request_body 인자의 값으로 POST api에 해당하는 serializer를 넣을 경우 DB 인스턴스에 수정하고자 할 때 보내는 데이터에 형태를 swagger 문서에 표시해준다.

  • responses의 경우 해당 api가 정상 작동 되었을 때 딕셔너리 형태로 들어간다 응답 상태코드를 로 serilizer를 으로 넣을 경우 swagger 페이지에서 어떻게 응답 받는지에 대한 상세 내용을 알려준다. 해당 내용은 해당글에서 한번 언급해서 생략

Member(models.py)

먼저 위의 API는 모델 Member에 적혀있는 필드 값을 변경하는 작업이다. 필드의 경우 Model Member의 특정 필드에 해당한다.

  • AWS S3에 저장된 이미지 링크가 해당 필드에 해당하고 문자열 형태로 저장된다.

  • 여기서 한가지, app Memeber(models.py) 내 다른 모델들과는 다르게 AbstractBaseUser를 상속받고 있는데 models.Model이 아닌 해당 클래스를 상속 받아서 사용하는 이유는 Django 로그인 절차가 아닌 인증 절차를 직접 구현하고자 할 때 해당 객체를 상속 받는다.

class Member(AbstractBaseUser):
	...
    profile_img = models.CharField(
        max_length=500, blank=True, null=True,
        verbose_name="프로필 이미지 URL"
    )
    ...
  • 실제 JWT를 구현해서 인증을 처리하고 있다. AbstractBaseUser에 대한 실질적인 구현에 있어 중요하게 설정해야 할 부분은 ¹해당 객체를 위한
    MemberManager(BaseUserManager)를 설정해 주는 일이다.
objects = Membermanager() 
  • 해당 부문을 설정함으로써 일반 유저 및 슈퍼유저의 생성 방식을 정의해 주는 것이다.

  • ²USERNAME_FIELD에 Member의 필드를 설정해줌으로써 로그인 시 어떤 필드를 아이디로 할 지 정해주어야 한다.

USERNAME_FIELD = "id"
  • ³REQUIRED_FIELDS에 필수로 값을 받는 항목을 설정해 줄 수 있다.
    REQUIRED_FIELDS = ["hand_phone", "activate", "name"]

생성한 유저 모델 후처리

model 작성 완료 후 해당 모델을 Django Admin에서 사용하길 원한다면 admin.py에 등록 작업을 해주어야 한다.

인증을 위한 유저 모델로 사용하기 위해선 settings.py에 등록해 주어야한다.

참고자료
참고자료
참고자료

serializer에 인자 넘기기

일반적으로 serializer에 인자를 넘기서 사용하는 방법에 3가지 경우가 있다. ¹인스턴스, ²데이터, ³인스턴스+데이터 이렇게이다.

  • serializer = PostSerializer(post)
  • serializer = PostSerializer(data=request.data)
  • serializer = PostSerializer(post, data=reqeust.data)
  • serializer = PostSerializer(post, reqeust.data)
  1. 인스턴스를 형성하는데 그 목적이 있다.
  2. 인스턴스의 특정 내용을 수정하는데 그 목적이 있다.
  3. 인스턴스의 특정 내용을 수정하는데 그 목적이 있다.

serializer.validated_data[field_name]

serialzer.validated_data는 프로퍼티이다. self._validated_data를 반환하는데 self.run_validation(self.inital_data)의 반환 값으로 유효성 데이터를 통과한 값들이다. 따라서 유효성을 통과한 값들 중 특정 필드에 접근하여 값을 가지고 오는 과정이다.

profile_img = serializer.validated_data["profile_img"]

해당 과정 후에 serializer.save() 시 값이 저장되게 된다.

정리

  • POST API로 수정 할 데이터의 형식과 받는 데이터의 형식에 관하여 데이터를 제공해주기 위해 swagger 작성하는 방법을 알아보았다.
  • 선언한 시리얼라이저를 통해 수정 할 데이터를 보내기 전 어떻게 시리얼라이저로 데이터를 담는지 알아보았다.
  • 데이터를 담고 있는 시리얼라이저 인스턴스에 대해 유효성 검사를 한 뒤 유효하지 않을 경우 에러처리하는 방법에 대해서 알아보았다.
  • 유효성 검사를 통과 한 경우 유효성 검사를 통과한 데이터에 접근하는 방법에 대해서 알아보았다.
  • 인스턴스 필드에 접근하여 유효성 검사를 통과한 데이터에 대한 값을 넣은 후 DB에 저장하는 방법에 대해서 알아보았다.
  • 작업을 완료한 후 REST API형식에 맞게 응답하는 방법을 작성하는 것에 대해서 알아보았다.

0개의 댓글