현제의 현재이야기
[OSOD] 회원가입 인증 이메일 본문
models.py
#####################이메일 관련###################################
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com' # 메일 호스트 서버
EMAIL_PORT = '587' # gmail과 통신하는 포트
EMAIL_HOST_USER = 'officialosod@gmail.com' # 발신할 이메일
EMAIL_HOST_PASSWORD = '' # 발신할 메일의 비밀번호
EMAIL_USE_TLS = True # TLS 보안 방법
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
#URL_FRONT = 'http://****' # 공개적인 웹페이지가 있다면 등록
ACCOUNT_CONFIRM_EMAIL_ON_GET = True # 유저가 받은 링크를 클릭하면 회원가입 완료되게끔
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
# ACCOUNT_EMAIL_VERIFICATION = "none"
EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL = '/' # 사이트와 관련한 자동응답을 받을 이메일 주소,'webmaster@localhost'
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 1
# 이메일에 자동으로 표시되는 사이트 정보
ACCOUNT_EMAIL_SUBJECT_PREFIX = "OSOD "
views.py
from django.shortcuts import render
from rest_framework.exceptions import NotFound
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from allauth.account.models import EmailConfirmation, EmailConfirmationHMAC
from rest_framework import status
class ConfirmEmailView(APIView):
permission_classes = [AllowAny]
def get(self, *args, **kwargs):
self.object = confirmation = self.get_object()
confirmation.confirm(self.request)
# A React Router Route will handle the failure scenario
return Response(status = status.HTTP_200_OK)
def get_object(self, queryset=None):
key = self.kwargs['key']
email_confirmation = EmailConfirmationHMAC.from_key(key)
if not email_confirmation:
if queryset is None:
queryset = self.get_queryset()
try:
email_confirmation = queryset.get(key=key.lower())
except EmailConfirmation.DoesNotExist:
# A React Router Route will handle the failure scenario
return Response(status = status.HTTP_404_NOT_FOUND)
return email_confirmation
def get_queryset(self):
qs = EmailConfirmation.objects.all_valid()
qs = qs.select_related("email_address__user")
return qs
urls.py
from dj_rest_auth.registration.views import VerifyEmailView, RegisterView
from dj_rest_auth.views import (
LoginView, LogoutView, PasswordChangeView,
PasswordResetView, PasswordResetConfirmView
)
from accounts.views import ConfirmEmailView
urlpatterns = [
path('admin/', admin.site.urls),
# 로그인
path('rest-auth/login', LoginView.as_view(), name='rest_login'),
path('rest-auth/logout', LogoutView.as_view(), name='rest_logout'),
path('rest-auth/password/change', PasswordChangeView.as_view(), name='rest_password_change'),
# 회원가입
path('rest-auth/registration', RegisterView.as_view(), name='rest_register'),
#
path('accounts/', include('allauth.urls')),
# 이메일 관련 필요
path('accounts/allauth/', include('allauth.urls')),
# 유효한 이메일이 유저에게 전달
re_path(r'^account-confirm-email/$', VerifyEmailView.as_view(), name='account_email_verification_sent'),
# 유저가 클릭한 이메일(=링크) 확인
re_path(r'^account-confirm-email/(?P<key>[-:\w]+)/$', ConfirmEmailView.as_view(), name='account_confirm_email'),
]
결과
해결해야 할 점
- 다시 링크를 누르면 500오류가 떠서 try, except구문을 줘서 예외처리를 해야겠다.
- 코드를 정확히 이해하지 못했어서 커스텀이 어렵다.
'DRF > OSOD' 카테고리의 다른 글
[OSOD] 비밀번호 변경 및 리셋 관련 (0) | 2023.02.16 |
---|---|
[OSOD] SerializerMethodField()에 대하여 (0) | 2023.02.13 |
[OSOD] Nested Serializer 및 views.py 작성 (0) | 2023.02.04 |
[OSOD] dj-rest-auth custom + logout (0) | 2023.01.26 |
[OSOD] dj-rest-auth + jwt 로그인 (0) | 2023.01.26 |
Comments