Today I Learned/django

장고 (django) - LoginView, LogoutView, LoginRequireMixin 설정하기

하나719 2023. 8. 11. 16:00
반응형

까다로운 login, logout을 장고가 제공해주는 class 를 사용해서 아주아주 간단하게 구현할 수 있다. 

 

1. LoginView

 

task_list.html

<!-- Login start -->
{% if request.user.is_authenticated %}
    <p>{{request.user}}</p>
    <a href="{% url 'logout' %}">Logout</a>
{% else %}
    <a href="{% url 'login' %}">Login</a>
{%endif%}
<!-- Login end  -->

왼쪽 화면 상단에 있는 Login 링크를 구현한 코드이다. 

유저가 로그인 된 상태이면 logout , 로그아웃된 상태이면 login 코드를 노출한다. 

 

 

views.py 

장고에서 제공하는 LoginView를 받아서 로그인 클래스 구현 

from django.contrib.auth.views import LoginView

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

    def get_success_url(self):
        #login 성공 후 task-list 페이지로 이동
        return reverse_lazy('tasks')

base/login.html

form.as_p로 간단하게 로그인 폼 그려주기

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

urls.py

from .views import TaskList, CustomLoginView


urlpatterns =[
  path('login/', CustomLoginView.as_view(), name='login'),
  path('', TaskList.as_view(), name='tasks'),

]

이렇게 아주아주 간단하게 로그인을 구현할 수 있다.

 

2. LogoutView

로그아웃뷰는 더욱 간단하게, views에서 따로 로직을 만들어주지않고 장고에서 제공하는 그대로 urls.py에서만 구현해서 사용했다.

템플릿 작성 없이 아주 간단하게 완성했다. 

 

urls.py 

LogoutView 클래스를 urls 파일에 불러와주고, path 내에서 직접 사용했다.

as_view() 함수의 인자로 next_page 를 지정해주어 로그아웃이 완료되면 이동할 페이지를 설정해줄 수 있다. 

from .views import TaskList, CustomLoginView
from django.contrib.auth.views import LogoutView


urlpatterns =[
  path('login/', CustomLoginView.as_view(), name='login'),
  path('', TaskList.as_view(), name='tasks'),
  path('logout/', LogoutView.as_view(next_page='tasks'), name='logout'),

]

 

3. LoginRequireMixin 

로그인을 해야만 접근할 수 있도록 설정하는데 도움을 주는 클래스이다. 

메인페이지에 로그인을 해야만 접근할 수 있도록 변경해보자.

 

views.py (기존 코드)

from django.views.generic.list import ListView
class TaskList(ListView):
    model = Task
    context_object_name = 'tasks'

views.py (설정 추가한 코드) 

from django.views.generic.list import ListView
from django.contrib.auth.mixins import LoginRequiredMixin

class TaskList(LoginRequiredMixin,ListView):
    model = Task
    context_object_name = 'tasks'

settings.py

아래 코드 추가 (login은 login page name으로 로그인 안된 유저를 어떤 페이지로 보낼지 설정 )

LOGIN_URL = 'login' 

 

이렇게 설정하면, 아까는 로그인을 하지 않아도 메인리스트에 접근이 가능했지만 이제 메인 리스트에 접근하려고하면 login 페이지로 자동으로 떨어진다. 

 

반응형