Django 프로젝트-To Do List(6): Login/Logout 구현

1 minute read

1. 로그인 구현

Todolist에 필요한 모델과 뷰를 모두 구성했으니 이제 로그인, 로그아웃을 구현해 볼 차례이다. 이 또한 클래스뷰로 미리 지정되어 있으니 이를 사용하면 된다.

우선 현재 유저가 누구인지 확인하는 절차를 거쳐야한다. 이를 request.user를 통해 알 수 있다.

사용자가 로그인하였을 때는 사용자 이름과 로그아웃 링크를, 로그아웃하였을 때는 로그인할 수 있는 로그인 링크를 나타내주어야 한다. task_list의 가장 상단에 이를 구현해보았다.

유저가 로그인을 하였다면 is_authenticated를 통해 인증여부를 확인할 수 있고 이를 통해 로그인, 로그아웃을 구분할 수 있다.

<!-- task/templates/task/task_list.html-->
{% if request.user.is_authenticated %}
<p>{{ request.user }}</p>
<a href="">Logout</a>
{% else %}
<a href="">Login</a>
{% endif %}

이번에는 뷰를 작성해보자. 앞선 뷰들과 같은 절차를 거치면 되는데, 다음의 코드를 천천히 한 번 살펴보자.

LoginView의 기본 템플릿 이름은 registration/login.html이다. 디렉토리가 registration에 저장된다는 것을 알아두자. 여기서는 templates/task로 바꾸어 주었다.

LoginView 또한 아이디와 비밀번호를 입력받을 폼이 필요하므로 fields를 통해 디스플레이 해준다.

redirect_authenticated_user는 로그인된 사용자가 로그인 페이지로 엑세스하려 할 때 리다이렉션될 수 있게 하는 메서드이다. 기본값은 False이다.

여기서 중요한 점은 LoginView는 success_url 속성이 아니라 get_success_url 메서드를 사용한다는 점이다.

# task/views.py
from django.contrib.auth.views import LoginView

class CustomLoginView(LoginView):
    template_name = 'task/login.html'
    fields = '__all__'
    redirect_authenticated_user = True
    next_page = 'tasks'

뷰를 다 작성했다면 url을 연결시켜주면 된다.

# task/urls.py
from .views import TaskList, TaskDetail, TaskCreate, TaskUpdate, TaskDelete, CustomLoginView

urlpatterns = [
    path('login/', CustomLoginView.as_view(), name="login"),
]

다음은 로그인 템플릿을 작성해보자. task/login.html을 만들고 폼을 디스플레이하자.

<!-- task/templates/task/task_login.html-->
<h1>Login</h1>

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="login">
</form>

2. 로그아웃 구현

로그아웃은 로그인과는 다르게 따로 템플릿을 작성할 필요가 없다(로그아웃은 그냥 버튼만 누르면 땡이니까). 굉장히 심플하게 구현되기 때문에 여기서는 뷰에 속성들을 따로 구현하지 않고 url에 바로 뷰의 속성들을 명시하였다.

next_page는 로그아웃을 하고 이동할 페이지를 지정하는 속성으로 여기서는 로그인 페이지로 이동하게 설정하였다.

# task/urls/py
from django.contrib.auth.views import LogoutView

urlpatterns = [
    path('logout/', LogoutView.as_view(next_page="login"), name="logout"),
]

핵심요약

  1. request.user
  2. is_authenticated
  3. loginview 디폴트 템플릿 이름: registration/login
  4. redirect_authenticated_user
  5. loginview/logoutview의 success_url: next_page

Leave a comment