Django CRUD - 7. Login, Logout

Mingi Shin·2023년 2월 15일
0

CRUD

목록 보기
8/11
post-thumbnail

모델을 활용해 Read, Create 기능을 다시 만들었다. 앞으로 Update, Delete를 만들 건데 그 전에 로그인, 로그아웃을 만들어 User에 따라 자신이 기입한 기이수학점 데이터를 개별적으로 확인하게 할 것이다.

1. Login

메인 페이지 내에서 로그인 링크를 가지고 있는 templates/navbar.html 파일을 수정한다.

<!-- templates/navbar.html -->
<h1><a href="{% url 'sju:index' %}">나는 무슨 수업을 들었는가</a></h1>
<div>
    <ul>
        <li>
        <a href="{% url 'common:login' %}">로그인</a>
        </li>
    </ul>
</div>

href 속성을 '#'에서 common:login'이라는 유의미한 URL로 매핑해주었다. 그럼 'common:login'을 만들어준다.

터미널에 django-admin startapp common 명령으로 common 앱을 생성하고 name='login' 의 path를 추가한다.

# common/urls.py

from django.urls import path
from django.contrib.auth import views as auth_views

app_name = 'common'

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(), name='login'),
]

보통의 path처럼 include나 view함수의 함수를 참조하지 않고 있다. 장고에서 로그인 뷰는 함수를 따로 만들 필요 없이 django.contrib.auth에서 LoginView 내장 함수를 사용하면 된다. 아주 편리.

이렇게 한 후 서버를 연결하고 로그인을 시도하면 registeration 디렉토리에 login.html 템플렛을 찾을 수 없다고 한다. urlpattern에서 사용한 LoginView는 registeration/login.html에서 로그인 템플렛을 찾는 것이 디폴트로 설정이 되어 있기 때문이다. LoginView가 우리가 만든 common 디렉토리의 login.html을 찾을 수 있도록 도와주자.

# common/urls.py

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
]

templates에 common 디렉토리를 만들고 login.html을 다음과 같이 작성해준다.

<!-- templates/common/login.html -->

{% extends 'base.html' %}
{% block content %}
<div>
    <form action="{% url 'common:login' %}" method="post">
        {% csrf_token %}
        <div>
            <label for="username">사용자ID</label>
            <input type="text" name="username" id="username"
                    value="{{form.username.value|default_if_none:''}}" placeholder="User Name">
        </div>
        <div>
            <label for="password">비밀번호</label>
            <input type="text" name="password" id="password"
                    value="{{form.password.value|default_if_none:''}}" placeholder="Password">
        </div>
        <button type="submit">로그인</button>
    </form>
</div>
{% endblock %}

LoginView에서 위 템플렛을 참조하고 있기 때문에 django.contrib.auth가 필수적으로 요구하는 항목을 포함하고 있어야 한다. (username과 password)

서버를 키면 로그인 창이 나온다. 현재 데이터베이스에는 슈퍼계정(장고 관리자 계정) 정보만 있다.
슈퍼계정으로 로그인하면 account/profile 페이지를 찾을 수 없다 뜨면 성공이다. django.contrib.auth에서 디폴트로 로그인 성공시 이동시킨 페이지이기 때문이다.

config/settings.py

LOGIN_REDIRECT_URL = '/sju/'

세팅파일에 추가해주면 로그인 성공 후 메인 페이지로 이동한다.
그런데 로그인에 성공해도 아직 로그인 페이지가 뜰 것이다. navbar.html을 if문으로 조금 수정해준다.

<!-- templates/common/navbar.html -->

<h1><a href="{% url 'sju:index' %}">나는 무슨 수업을 들었는가</a></h1>
<div>
    <ul>
        <li>
        {% if user.is_authenticated %}
        <a href="#">{{ user.username }} (로그아웃)</a>
        {% else %}
        <a href="{% url 'common:login' %}">로그인</a>
        {% endif %}
        </li>
    </ul>
</div>

라고 작성하면?

username 옆에 로그아웃이 떠 준다.

2. Logout

navbar.html 파일에 로그아웃 링크를 #에서 {% url 'common:logout' %}이라는 유의미한 링크로 바꿔준다. 링크 추가 해줬으니 path도 추가한다.

# common/urls.py

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

로그인처럼 로그아웃시 redirect할 url도 세팅파일에 작성한다.

# config/settings.py

LOGIN_REDIRECT_URL = '/sju/'
LOGOUT_REDIRECT_URL = '/sju/'

끝 ~

profile
@abcganada123 / git:ABCganada

0개의 댓글