log.Sehee
TIL / 5/24 / Django 회원가입 이메일 인증코드발송 본문
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