
account_api_v1 = [
path("send_email/", api.SendEmailAPIView.as_view(), name="send_email"),
]
urlpatterns += [
path("api/", include((account_api_v1, "account-v1"))),
]
include()는 URL 패턴을 모듈화하고 재사용하는 데 사용한다.
특정 URL 경로(api/)에 대해 다른 URL 패턴(account_api_v1)을 참조하고 포함시킬 수 있다.
from rest_framework import serializers
class SendEmailSerializer(serializers.Serializer):
email = serializers.EmailField()
Serializer는 모델과 독립적으로 작동하는 데이터를 직렬화/역직렬화해야 할 때 사용한다.
사용 예:
API 응답에서 사용자 정의 데이터 구조를 반환해야 할 때.
모델과 무관한 입력 데이터를 처리할 때.
복잡한 유효성 검사 및 데이터 변환이 필요할 때.
여기서는 입력받은 email 필드가 유효한 이메일 주소인지 확인하고 JSON과 같은 데이터 형식에서 파이썬 데이터 타입으로 변환한다.(Serializer의 to_internal_value())
모델의 필드를 자동으로 직렬화한다.
기본 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을 작성한다.
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,
)
직렬화된 데이터의 유효성을 검사
유효성 검사를 통과한 데이터에 접근한다.
SendEmailSerializer에서 email 필드가 정의되었기 때문에 유효성 검사를 통과한 데이터의 key로 email을 사용한다.