[Django] POST API 분석, APIView

서재환·2022년 9월 14일
0

Django

목록 보기
30/40

PhoneAuthCreateView

class PhoneAuthCreateView(APIView):
    """
    전화 번호 인증 요청 (회원가입)

    ---
    """

    permission_classes = (permissions.AllowAny,)

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

        if not serializer.is_valid():
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        agent_id = serializer.validated_data.get("agent_id")
        phone_number = serializer.validated_data["phone_number"]

        if agent_id is not None:
            existPhoneMember = Member.objects.filter(
                member_agent__agent_id=agent_id, hand_phone=phone_number
            )
            if existPhoneMember.count() > 0:
                member_id = existPhoneMember.first().id
                raise apiexceptions.ValidationError(
                    detail=member_id,
                    code="EXIST_PHONE_NUMBER",
                    user_message="해당 업체에 가입이 되어있는 ID입니다.",
                )
        # else:
        #     existPhoneMember = Member.objects.filter(hand_phone=phone_number)

        # 한 휴대폰 번호로 여러 계정 가입 가능
        result = PhoneAuthHelper.saveAuthNum(phone_number)
        res = PhoneAuthCreateResponseSerializer(result)

        return Response(res.data)

permission_classes

  • permissions 모듈에서 AllowAny객체permission_classes 변수에 할당
  • 해당 API로 요청되는 모든 request를 허용한다. 주석 설명에서 permission_classes를 빈칸으로 놓는 것 보다 AllowAny를 할당하는 것이 의미전달에 좋다고 기입되어있다.
class AllowAny(BasePermission):
    """
    Allow any access.
    This isn't strictly required, since you could use an empty
    permission_classes list, but it's useful because it makes the intention
    more explicit.
    """

    def has_permission(self, request, view):
        return True

@swagger_auto_schema

  • 서버에서 2XX 상태코드로 응답이 왔을 때 기입해준 serializer 형식이 스웨거 문서에 표시된다.
  • request_body 부문에 serializer 기입 시 요청 보낼 데이터 형식을 스웨거 문서에 표시해준다.

post

  1. 프론트에서 보낸 데이터에 대한 유효성 검사 진행 후 속성에 접근하여 값을 추출, 유효성 검사를 통과하지 못하면 에러 메세지와 상태코드를 반환한다.
def post(self, request):
        serializer = PhoneAuthCreateSerializer(data=request.data)

        if not serializer.is_valid():
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  1. 유효성 검사를 통과했다면 해당 요청을 보낸 사용자의 agent_idhand_phone 값을 갖고 filter를 걸어서 테이블 Member에서 해당하는 레코드를 가지고온다. 만일 레코드가 있다면 해당 번호와 해당 아이디가 Member 테이블에 존재한다는 것이고 이것은 해당 아이디와 비밀번호로 가입한 내력이 있다는 의미가 되어 예외를 발생시킨다.
agent_id = serializer.validated_data.get("agent_id")
phone_number = serializer.validated_data["phone_number"]

if agent_id is not None:
    existPhoneMember = Member.objects.filter(
        member_agent__agent_id=agent_id, hand_phone=phone_number
    )
    if existPhoneMember.count() > 0:
        member_id = existPhoneMember.first().id
        raise apiexceptions.ValidationError(
            detail=member_id,
            code="EXIST_PHONE_NUMBER",
            user_message="해당 업체에 가입이 되어있는 ID입니다.",
        )
  1. 마지막으로 휴대폰 번호와 요청한 사용자의 agent_id를 JSON 형태로 반환한다.
result = PhoneAuthHelper.saveAuthNum(phone_number)
res = PhoneAuthCreateResponseSerializer(result)

return Response(res.data)

정리

해당 API에 오기까지 6개의 API를 다루면서 [GET, GET, POST, DELETE, PATCH, POST] 다루면서 이번 POST API를 이해하는데 있어 상대적으로 더 적은 시간이 들어갔다. 앞으로도 꾸준히 하면서 조금씩 실력을 늘려나가야겠다.

0개의 댓글