swarf00 / swarf00.github.io

💎 A super customizable Jekyll theme for personal site, team site, blog, project, documentation, etc.
https://tianqi.name/jekyll-TeXt-theme/
MIT License
0 stars 1 forks source link

사용자인증(3) - 장고(Django) 핥짝 맛보기 #11

Open swarf00 opened 5 years ago

swarf00 commented 5 years ago

https://swarf00.github.io/2018/12/14/logout.html

장고(Django) 웹프레임워크에서 이메일인증 및 로그아웃 기능 구현방방을 알아봅니다.

cskang8264 commented 5 years ago

shell 커맨드에서 이메일이 잘 발송되는 지 테스트하고 나서 AttributeError: 'User' object has no attribute 'email_user' 오류가 뜨는데 어떻게 해결해야 되냐요?

sehunone commented 5 years ago

@cskang8264 shell 커맨드에서 이메일이 잘 발송되는 지 테스트하고 나서 AttributeError: 'User' object has no attribute 'email_user' 오류가 뜨는데 어떻게 해결해야 되냐요?

email_user 라는 메소드가 정의되어 있지 않은 문제인데, 가입하기 튜토리얼에서 User 모델 정의할 때 해당 메소드를 빼먹고 올렸었네요. 죄송합니다. 해당부분은 수정했습니다. 혹시 번거로우실까봐 여기에 다시 올려드릴께요.

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField('email', unique=True)
    name = models.CharField('이름', max_length=30, blank=True)
    is_staff = models.BooleanField('스태프 권한', default=False)
    is_active = models.BooleanField('사용중', default=True)
    date_joined = models.DateTimeField('가입일', default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'email'                     # email을 사용자의 식별자로 설정
    REQUIRED_FIELDS = ['name']                   # 필수입력값

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        swappable = 'AUTH_USER_MODEL'

    def email_user(self, subject, message, from_email=None, **kwargs): # 이메일 발송 메소드
        send_mail(subject, message, from_email, [self.email], **kwargs)
shikshik99 commented 5 years ago

받은 이메일에서 인증할 때 'is_valid_token() takes 1 positional argument but 2 were given' 라고 뜨는데 어떻게 해결해야 할까요? UserVerificationView클래스의 get 함수 호풀시 일어나는 일입니다.

swarf00 commented 5 years ago

@shikshik99 받은 이메일에서 인증할 때 'is_valid_token() takes 1 positional argument but 2 were given' 라고 뜨는데 어떻게 해결해야 할까요? UserVerificationView클래스의 get 함수 호풀시 일어나는 일입니다.

죄송합니다. 코드 중에 오타가 있었군요. is_valid_token 함수를 호출할 때 **kwargs 를 넘겨주셔야 합니다.

# user/views.py

from django.http import HttpResponseRedirect
from django.views.generic.base import TemplateView

# 생략

class UserVerificationView(TemplateView):

    model = get_user_model()
    redirect_url = '/user/login/'
    token_generator = default_token_generator

    def get(self, request, *args, **kwargs):
        if self.is_valid_token(**kwargs):
            messages.info(request, '인증이 완료되었습니다.')
        else:
            messages.error(request, '인증이 실패되었습니다.')
        return HttpResponseRedirect(self.redirect_url)   # 인증 성공여부와 상관없이 무조건 로그인 페이지로 이동

    def is_valid_token(self, **kwargs):
        pk = kwargs.get('pk')
        token = kwargs.get('tonen')
        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

# 생략
HoonHaChoi commented 4 years ago

UserRegistrationView에서 html_message 부분 from_email=self.email_template_name 이라고 써있는데 오타인거 맞죠?

sehunone commented 4 years ago

@1301625 UserRegistrationView에서 html_message 부분 from_email=self.email_template_name 이라고 써있는데 오타인거 맞죠?

예 다시 보니 오타네요. 아래처럼 수정하시면 정상적으로 동작할 겁니다.

html_message = render(self.request, self.email_template_name, {'url': url}).content.decode('utf-8')