관리 메뉴

log.Sehee

TIL / 5/24 / Django 회원가입 이메일 인증코드발송 본문

TLC - 5 ⛺/Today I Learn

TIL / 5/24 / Django 회원가입 이메일 인증코드발송

Sehe_e 2023. 5. 25. 01:53

 


 

settings.py

EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com" # 메일 호스트 서버(고정값)
EMAIL_PORT = "587" # gmail 포트(고정값)
EMAIL_HOST_USER = get_secret("EMAIL_HOST_USER") # 발신할 이메일
EMAIL_HOST_PASSWORD = get_secret("EMAIL_HOST_PASSWORD") # 발신할 메일의 앱 비밀번호
EMAIL_USE_TLS = True  # TLS 보안 방법
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER  # 사이트와 관련한 자동응답을 받을 이메일 주소(고정값)

발신할 이메일 주소와 해당 메일의 앱 비밀번호는 공개적으로 올라가면 안되니까

이미 숨김처리해둔 secrets.json에 추가하여 편하게 같이 관리하기

 

secrets.json

{
    "SECRET_KEY" : "django-insecure-~...",
    "EMAIL_HOST_USER" : "발신 이메일 주소",
    "EMAIL_HOST_PASSWORD" : "앱 비밀번호"
}

 


 

models.py

class Verify(models.Model):
    email = models.EmailField()
    athnt_code = models.CharField(max_length=6)

인증번호와 이메일을 발급 & 저장할 모델을 생성

 

serializers.py

# 인증번호 대조
class VerifySerializer(serializers.Serializer):
    email = serializers.EmailField()
    verify_code = serializers.CharField(max_length=6)

    def validate(self, data):
        email = data.get("email")
        verify_code = data.get("verify_code")
        access = get_object_or_404(Verify, email=email)
        if verify_code == access.athnt_code:
            return data

팀원 분의 도움으로 작성한.. serializers.ModelSerializer로 실행하면 Meta 태그가 없다고 뜨며,

serializers.Serializer를 사용할 수 있다는.. 새로운 사실을 알게되었다.

여기에서 직접 필드를 생성, email과 verify_code를 받아 생성한 코드와 입력받은 코드가 일치하는지 검사하는 함수를 작성

 


 

views.py

# 인증코드 생성 & 이메일 발송
class AthntCodeCreateView(APIView):
    def post(self, request):
        email = request.data.get("email", "")
        if User.objects.filter(email=email).exists():
            return Response(
                {"message": "이미 가입된 이메일입니다."}, status=status.HTTP_400_BAD_REQUEST
            )
        athnt_code = str(randint(1, 999999)).zfill(6)
        message = EmailMessage(
            "ChangeART [Verification Code]",
            f"인증코드 [{athnt_code}]",
            "changeart@gmail.com",
            [email],
        )
        authen_Code = Verify(email=email, athnt_code=athnt_code)
        authen_Code.save()
        message.send()
        return Response({"message": "이메일을 보냈습니다."}, status=status.HTTP_200_OK)


# 이메일 인증 & 회원가입
class SignupView(APIView):
    def post(self, request):
        Verify = VerifySerializer(data=request.data)
        if Verify.is_valid():
            serializer = UserSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response({"message": "가입완료!"}, status=status.HTTP_201_CREATED)
            else:
                return Response(
                    {"message": f"${serializer.errors}"},
                    status=status.HTTP_400_BAD_REQUEST,
                )
        else:
            return Response({"message": "인증번호 불일치"}, status=status.HTTP_400_BAD_REQUEST)

+ 이메일 노출되면 안된다고 해놓고.. 대놓고 써놨다.. 고치면서 view는 나중에 작성..

 

 

 

 

 


나만의 작은 꼬북튜터님 TDMI.. To Day Much Information..

 

튜터님이 모자라..

튜터님 게이지가 모자라요..

할 말이 모자라니까.. 여러분께 뿌립니다..

튜터님의 유튜브 주소에요..

>> 꼬북튜터님 보러가기...

보러가세요.. 귀여우세요.. :>....

 

 

 

 

Comments