DRF-SendEmailAPI

김의석 ·2024년 6월 10일

Django

목록 보기
32/39

SendEmailAPIView

API 명세서

1. urls.py

account_api_v1 = [
    path("send_email/", api.SendEmailAPIView.as_view(), name="send_email"),
]

urlpatterns += [
    path("api/", include((account_api_v1, "account-v1"))),
]

path("api/", include())

include()는 URL 패턴을 모듈화하고 재사용하는 데 사용한다.
특정 URL 경로(api/)에 대해 다른 URL 패턴(account_api_v1)을 참조하고 포함시킬 수 있다.

2. serializers.py

from rest_framework import serializers


class SendEmailSerializer(serializers.Serializer):
    email = serializers.EmailField()

Serializer vs ModelSerializer

Serializer

Serializer는 모델과 독립적으로 작동하는 데이터를 직렬화/역직렬화해야 할 때 사용한다.

사용 예:
API 응답에서 사용자 정의 데이터 구조를 반환해야 할 때.
모델과 무관한 입력 데이터를 처리할 때.
복잡한 유효성 검사 및 데이터 변환이 필요할 때.

여기서는 입력받은 email 필드가 유효한 이메일 주소인지 확인하고 JSON과 같은 데이터 형식에서 파이썬 데이터 타입으로 변환한다.(Serializer의 to_internal_value())

ModelSerializer

모델의 필드를 자동으로 직렬화한다.
기본 CRUD (생성, 읽기, 업데이트, 삭제) 작업을 단순화하며, 모델의 필드와 유효성 검사를 자동으로 포함한다.

사용 예:
모델 인스턴스의 직렬화 및 역직렬화를 처리할 때.
API 엔드포인트에서 기본적인 CRUD 작업을 수행할 때.
모델 기반 데이터 구조를 단순하게 직렬화할 때.

# ModelSerializer 사용 예시

class PostListSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()

    class Meta:
        model = Post
        fields = [
            "id",
            "title",
            "author",
        ]

    @staticmethod
    def get_optimized_queryset() -> QuerySet[Post]:
        return Post.objects.all().only("id", "title", "author").select_related("author")

사용 예시를 보면 알수 있듯이
Serializer와 QuerySet의 필드 대응을 위해 meta 클래스를 작성하고 모델 객체를 직접 직렬화 및 역직렬화, 그리고 CRUD를 수행하기 위해 QuerySet을 작성한다.

3. api.py

class SendEmailAPIView(APIView, PasswordResetForm):
    def post(self, request):
        serializer = SendEmailSerializer(data=request.data)
        if serializer.is_valid():
            email = serializer.validated_data["email"]

            code = "".join(random.choices(string.ascii_uppercase + string.digits, k=6))
            url_code = urlsafe_base64_encode(force_bytes(code))

            protocol = "http"  # 서비스 프로토콜 = rquest.is_secure
            domain = "localhost:8000"  # 서비스 도메인 = request.get_host()
            code_confirm_url = f"{protocol}://{domain}/api/confirm_email/{url_code}/"

            send_mail(
                "안녕하세요. POKO 입니다!",
                f"회원가입을 위한 코드입니다. {code}, {code_confirm_url}",
                "es468@naver.com",  # 발신자 이메일
                [email],
                fail_silently=False,
            )

            return Response(
                {"message": "입력한 이메일로 코드가 인증코드가 발송 되었습니다."},
                status=status.HTTP_200_OK,
            )
        return Response(
            data={"message": "이메일 주소가 올바르지 않습니다. 다시 시도해주세요."},
            status=status.HTTP_400_BAD_REQUEST,
        )

serializer.is_valid()

직렬화된 데이터의 유효성을 검사

email = serializer.validated_data["email"]

유효성 검사를 통과한 데이터에 접근한다.
SendEmailSerializer에서 email 필드가 정의되었기 때문에 유효성 검사를 통과한 데이터의 key로 email을 사용한다.

profile
널리 이롭게

0개의 댓글