본문 바로가기
Django

Django 로그인, 로그아웃 기능 추가하기

by 개발자54 2022. 12. 1.

※ 이 포스트는 <Django로 쉽게 배우는 배프의 오지랖 파이썬 웹 프로그래밍>을 참고하여 작성하였습니다.

 

1. 프로젝트에 accounts 앱 생성

$ python manage.py startapp accounts

 

 

2. config/settings.py에 앱 등록

# config/settings.py

...

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "fst",
    # 추가한 코드
    "accounts",
    # 추가한 코드 끝
]

 

 

3. base.html 위치 변경

1에서 2로 이동

기존의 프로젝트에서는 base.html이 fst/templates에 위치했다. 그런데 이렇게 설정할 경우 다른 앱에서는 이 위치의 base.html을 읽을 수가 없게 된다. base.html을 앱에 상관 없이 사용하기 위해 프로젝트 루트에 templates 폴더를 만들고 그 안에 base.html을 넣어준다.

 

 

4.  로그인, 로그아웃 기능 만들기

1) accounts 폴더에 urls.py 생성하고 하단과 같이 작성

# config/urls.py

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

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

2) 루트 urls.py에 연결

# config/urls.py

...

urlpatterns = [
    path('fst/', include('fst.urls')),
    path('admin/', admin.site.urls),
    # 추가한 코드
    path('accounts/', include('accounts.urls')),
    # 추가한 코드 끝
]

3) 템플릿 생성 : accounts 폴더 아래에 templates/registration 경로 생성 후 login.html, logout.html 생성

<!-- accounts/templates/registration/login.html -->

{% extends 'base.html' %}
{% block title %}로그인{% endblock %}

{% block content %}
<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8 panel panel-default">
        <div class="alert aert-info">로그인 정보를 입력하세요.</div>
        <form action="" method="post">
            {{form.as_p}}
            {% csrf_token %}
            <input class="btn btn-primary" type="submit" value="Login">
        </form>
    </div>
    <div class="col-md-2"></div>
</div>
{% endblock %}
<!-- accounts/templates/registration/logout.html -->

{% extends 'base.html' %}
{% block title %}로그아웃{% endblock %}

{% block content %}
<div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-8 panel panel-default">
        <div class="alert aert-info">성공적으로 로그아웃되었습니다.</div>
        <a class="btn btn-primary" href="{% url 'login' %}">다시 로그인하기</a>
    </div>
    <div class="col-md-2"></div>
</div>
{% endblock %}

 

 

5. base.html에 로그인, 로그아웃 링크 추가

장고에서 기본적으로 제공되는 user 객체를 이용하여 인증된 유저(즉, 로그인한 유저)일 경우 로그아웃 버튼만 보이게 하고,

인증되지 않은 유저(즉, 로그인하지 않은 유저)일 경우 로그인 버튼만 보이게 한다.

<!-- templates/base.html -->

...

<div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
            <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
        </li>
        <!-- 추가한 코드 -->
        {% if user.is_authenticated %}
        <li class="nav-item"><a href="{% url 'logout' %}" class="nav-link">로그아웃</a></li>
        {% else %}
        <li class="nav-item"><a href="{% url 'login' %}" class="nav-link">로그인</a></li>
        {% endif %}
        <!-- 추가한 코드 끝 -->
    </ul>
</div>
            
...

 

 

6. 서버 실행하여 결과 확인

$ python manage.py runserver

리스트 조회 페이지에 들어가니 로그인 버튼이 있다. 현재는 관리자 계정만 있으므로 관리자 계정으로 로그인을 해보자.

그런데 로그인을 하면 404 페이지가 뜬다.

로그인 후 이동할 페이지의 기본값 주소가 /profile인데, /profile 페이지를 만들어놓지 않으므로 이와 같은 오류가 뜬다.

따라서 로그인 후 바로 리스트 페이지로 이동하도록 설정을 변경한다.

config/settings.py로 들어가 제일 하단에 로그인 후 이동하고 싶은 페이지를 LOGIN_REDIRECT_URL = 뒤에 작성해준다.

# config/settings.py

...

LOGIN_REDIRECT_URL = '/fst'

그러고나서 다시 관리자 계정으로 로그인을 해보면,

관리자 계정으로 로그인을 하면, 로그인 글자가 사라지고 로그아웃 글자가 생긴다.

로그아웃 테스트도 해보자.

 

그러나 관리자 계정만 가지고는 이 기능을 만든 의미가 없다.

다음 포스트에서는 회원가입 기능을 추가해보자.

댓글