WEB

[Django 09] Authentication

mhko411 2021. 3. 23. 14:01
728x90

폼을 통해 게시글을 작성할 때 제목과 내용, 작성시간, 수정시간 등을 데이터베이스의 모델과 연관된 ModelForm을 생성하여 활용하였다. ModelForm을 통해 쉽게 폼을 입력받고 데이터베이스에 저장할 수 있었다. 이처럼 폼 클래스를 사용하면 복잡한 동작도 간단하게 구현할 수 있는데 Django에서는 사용자가 로그인, 로그아웃, 회원가입 등의 기능을 할 수 있도록 폼 클래스를 제공한다. 이를 위해 어떠한 폼이 있는지 알아본다.


 

로그인과 로그아웃

로그인과 로그아웃을 한다는 것은 서버로부터 쿠키를 부여받고 세션이 시작되거나 종료되는 것을 의미한다. 먼저 로그인 버튼을 눌렀을 때 View에서 어떠한 동작을 하는지 알아보자.

 

먼저 로그인을 하는 Form을 불러와야 하며 사용자의 인증을 위한 Form은 "django.contrib.auth.forms"에 위치한다. 여기서 로그인을 도와주는 AuthenticationForm을 import하여 사용한다. 이를 사용하면 Django에서 만든 로그인 페이지를 만들 수 있다. 

사용자가 ID와 비밀번호를 입력했다면 login 함수의 POST 조건에 도달하게 된다. 그렇다면 사용자가 입력한 정보를 채워 form에 저장하고 유효한지 확인한다. 알맞게 정보를 입력했을 때 실제로 로그인을 하도록 해야하며 이는 login을 import하고 함수의 이름과 겹치지 않도록 as로 auth_login이라고 별명을 짓는다.

auth_login을 통해 form에서의 user를 불러와 세션을 시작하게 된다.

from django.contrib.auth import login as auth_login
from django.contrib.auth.forms import AuthenticationForm

def login(request):
	if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
       
        if form.is_valid():
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/login.html', context)

 

로그아웃은 로그인보다 간단한다.

로그아웃 버튼을 눌렀을 때 세션을 종료시키면 되고 로그인과 같은 경로에서 logout을 import하고 auth_logout이라는 별명을 짓는다.

logout함수에서는 auth_logout을 통해 POST로 전달되는 request의 정보에 대해 세션을 종료하도록 한다.

from django.contrib.auth import logout as auth_logout

def logout(request):
    auth_logout(request)
    return redirect('articles:index')

 

회원가입

회원가입을 위해서는 어떠한 Form을 사용하는지 알아보자. 

Django에서 회원가입에 대한 Form Class도 제공하고 있으며 회원가입을 눌렀을 때 View에서 다음과 같이 동작한다.

 

회원가입을 위해서는 UserCreationForm이라는 클래스를 사용한다. 이를 회원가입을 위한 html 문서에 전달하여 form을 생성하고 입력된 정보를 POST로 전달하도록 한다.

사용자가 정보를 입력하고 회원가입 버튼을 눌렀을 때 POST 조건이 처리된다. 같은 클래스인 UserCreationForm에서 입력한 정보를 꺼내어 form에 저장하고 유효한지 검사를 한다. 

유효하다면 form.save()를 통해 저장하는데 이때 user에 대한 정보를 반환한다. 이를 user 변수에 담아 로그인을 시도하도록 한다. 

auth_login()으로 로그인을 할 때는 request와 user에 대한 정보를 넘겨야하기 때문에 반환받은 user를 그대로 전달한다.

from django.contrib.auth import login as auth_login
from django.contrib.auth.forms import UserCreationForm

def signup(request):

    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('articles:index')
    else:
        form = UserCreationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/signup.html', context)

 

'WEB' 카테고리의 다른 글

[WEB] 토큰 기반 인증과 JWT  (0) 2021.10.13
[Django 08] Forms  (0) 2021.03.16
[Django 07] CRUD  (0) 2021.03.11
[Django 06] Model  (0) 2021.03.10
[Django 05] form 사용하기  (0) 2021.03.09