회원가입,로그아웃 // 장고 기본인증(2)

2022. 4. 19. 13:52
  • 인프런 이진석 강사님의 장고 강의를 참고

Usercreationform

  • modelform
  • 유저모델과 연동되어, 유저이름을 필드명으로 가져옴
  • 그외에 추가적으로 패스워드 등의 추가필드 등을 설정하여 가지고 있으며, 추가필드들에 대하여 다양한 로직을 가지고 있다.
    • 두 번의 패스워드를 입력받아, 두 패스워드가 서로 일치하는지 확인
    • 입력받은 패스워드에 암호화를 적용하여 DB에 저장. 즉 usercreationform을 사용하여 회원가입을 하면 비밀번호는 자동으로 암호화가 된다.
    • (참고로 set_password 로직을 사용해 암호화를 진행하며, 일반적으로 DB에 저장되는 패스워드는 반드시 암호화가 되어야만 한다)

 

회원가입 View 구현

  • model과 form만 설정해주면 알아서 모델 instance를 생성하고 저장해주는 Createview를 사용
  • 바로 위에서 언급한 Usercreationform을 formclass로 설정
  • 장고 내부의 User모델을 createview의 모델로 설정
    • User모델을 들고 올때는 get_user_model을 통해서 들고와야 한다!(안그럼 꼬일 수도 있음)
  • success_url은 회원가입 후에 어떤 페이지로 이동할지에 관한 것
    • 아래 예시에서 값으로 준 settings.LOGIN_URL의 default값은 accounts/login/임.(즉 회원가입시 accounts/login/으로 자동이동)
#views.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
from django.views.generic import CreateView

#유저모델 설정
User = get_user_model()

signup = CreateView.as_view(
    model = User,
    form_class = UserCreationForm,
    success_url = settings.LOGIN_URL,
    template_name='accounts/signup_form.html'
)

 

회원가입 하자마자 로그인

  • 회원가입을 하면 바로 로그인이되고, 로그인 후에 user의 프로필로 이동하는 게 자연스러움
  • 따라서 회원가입 로직내에 로그인 로직을 넣어주고, 회원가입완료시 profile로 이동하도록 success_url을 조정해주면 의도한대로 된다.
  • 장고내에서 로그인을 담당하는 함수는 contrib.auth에 있는 login임. 얘를  auth_login이라는 이름으로 받아준다.
  • createview는 modelformmixin을 상속받고, modelform mixin안에는 form_valid라는 함수가 있음
    • form필드의 값들이 전부 유효할 경우 해당 객체를 DB에 저장해주는, 즉 form.save()를 호출해주는 함수임
    • 링크 : https://github.com/django/django/blob/main/django/views/generic/edit.py#L133
    • 솔직히 얘가 정확히 뭔지 모르겠는데, form_valid를 오버라이딩+super()를 활용해 기존 로직을 유지하면서 사이에 auth_login을 집어넣으면 로직이 진행되는 도중에 자연스럽게 로그인이 된다.
  • success_url의 값은 settings.LOGIN_REDIRECT_URL을 줬음. LOGIN_REDIRECT_URL의 defualt값이 accounts/profile/이라 '회원가입 > 로그인 > profile로 이동까지' 한번에 이루어짐
#views.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
from django.contrib.auth import login as auth_login
from django.views.generic import CreateView

class SignupView(CreateView):
    model = User
    form_class = UserCreationForm
    success_url = settings.LOGIN_REDIRECT_URL
    template_name='accounts/signup_form.html'
    
    def form_valid(self,form):
        response = super().form_valid(form)
        user = self.object
        auth_login(self.request,user)
        return response

 

'django > basic' 카테고리의 다른 글

API 서버와 REST  (0) 2022.04.28
장고 에러 모음집  (0) 2022.04.23
로그인처리(LoginView) , 프로필 수정 // 장고 기본인증(1)  (0) 2022.04.19
Generic editing views // Forms(6)  (0) 2022.04.18
Form validation : django form(5)  (0) 2022.04.17

BELATED ARTICLES

more