회원가입시 이메일 보내는 형식 지정하는 page (templates/user/email/registration_verification.html)
재 인증을 신청하는 page (templates/user/resend_verify_email.html)
models.py 수정
이메일 인증을 수행시 로그인이 가능하도록 is_active 의 default 값을 False로 지정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classUser(AbstractBaseUser, PermissionsMixin): # 생략 is_staff = models.BooleanField( _('staff status'), default=False, help_text=_('Designates whether the user can log into this admin site.'), ) is_active = models.BooleanField( _('active'), default=False, # 기본값을 False 로 변경 help_text=_( 'Designates whether this user should be treated as active. ' 'Unselect this instead of deleting accounts.' ), ) # 생략
# from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render from django.http import HttpResponseRedirect from django.contrib.auth import get_user_model from django.contrib.auth.views import LoginView from django.views.generic import CreateView, FormView from django.views.generic.base import TemplateView
from user.models import User
from user.forms import UserRegistrationForm, LoginForm, VerificationEmailForm from user.mixins import VerifyEmailMixin from django.contrib import messages from django.contrib.auth.tokens import default_token_generator
defform_valid(self, form): response = super().form_valid(form) if form.instance: self.send_verification_email(form.instance) return response
classUserVerificationView(TemplateView):# 인증 보내기
model = get_user_model() redirect_url = '/user/login/' token_generator = default_token_generator
defget(self, request, *args, **kwargs): if self.is_valid_token(**kwargs): messages.info(request, '인증이 완료되었습니다.') else: messages.error(request, '인증이 실패되었습니다.') return HttpResponseRedirect(self.redirect_url) # 인증 성공여부와 상관없이 무조건 로그인 페이지로 이동
defis_valid_token(self, **kwargs): pk = kwargs.get('pk') token = kwargs.get('token') user = self.model.objects.get(pk=pk) is_valid = self.token_generator.check_token(user, token) if is_valid: user.is_active = True user.save() # 데이터가 변경되면 반드시 save() 메소드 호출 return is_valid
classResendVerifyEmailView(VerifyEmailMixin, FormView):# 재 인증 보내기 model = get_user_model() form_class = VerificationEmailForm success_url = '/user/login/' template_name = 'user/resend_verify_email.html'
defform_valid(self, form): email = form.cleaned_data['email'] try: user = self.model.objects.get(email=email) except self.model.DoesNotExist: messages.error(self.request, '알 수 없는 사용자 입니다.') else: self.send_verification_email(user) returnsuper().form_valid(form)
mixins.py 추가
UserRegistrationView 와 ResendVerifyEmailView의 기본 메소드(인증보내기)를 지정해서 코드를 단순화 시켜준다.
from django.contrib import messages from django.contrib.auth.tokens import default_token_generator from django.shortcuts import render from minitutorial import settings