리셋 되지 말자

[CSAPI] Django login, logout 구현 본문

프로젝트

[CSAPI] Django login, logout 구현

kyeongjun-dev 2021. 10. 5. 13:49

login, logout 구현

먼저 사용자에게 보여질 templates 디렉토리를 설정한다

config/settings.py 수정

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'], # 입력
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

templates 폴더를 생성

$ mkdir -p templates/login

 

login/urls.py 수정 - LoginView는 registration이라는 템플릿 디렉터리에서 login.html 파일을 찾기 때문에 templates의 login 디렉토리에서 템플릿을 찾도록 설정한다. 그리고 template 에서 url 설정을 편하게 하기 위해 URL 별칭(app_name='login')과 URL 네임스페이스(name='login')도 추가해준다.

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

app_name = 'login'

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

 

templates/login/login.html 생성

$ vi templates/login/login.html

<html>
	<head>
    </head>
    <body>
    	<h1>login page</h1>
    </body>
</html>

 

user/login url 접속 테스트

 

login.html 수정

{% block content %}
<html>
    <head>
    </head>
    <body>
        <form method="post" action="{% url 'login:login' %}">
            {% csrf_token %}
            {% if form.errors %}
                {% for field in form %}
                    {% for error in field.errors %}  <!-- field error -->
                        <strong>{{ field.label }}</strong>
                        {{ error }}
                    {% endfor %}
                {% endfor %}
                {% for error in form.non_field_errors %}   <!-- None field error -->
                    <strong>{{ error }}</strong>
                {% endfor %}
            {% endif %}
            <br>
            <label for="username">사용자ID</label>
                <input type="text" name="username" id="username" value="{{ form.username.value|default_if_none:'' }}">
            <label for="password">비밀번호</label>
                <input type="password" name="password" id="password" value="{{ form.password.value|default_if_none:'' }}">      
            <button type="submit">로그인</button>
        </form>
    </body>
</html>
{% endblock %}

 

로그인 성공시 모습 - django.contrib.auth 는 default로, 로그인에 성공하면 /accounts/profile/ 로 이동한다.

 

로그인 성공 시, redirect url 지정 - settings.py 에 LOGIN_REDIRECT_URL 을 지정 - 로그인 성공시 api/ url로 이동하도록 설정

LOGIN_REDIRECT_URL = '/'

 

로그인 성공시 redirect 확인 - main url로 이동하는 것을 확인(로그인 성공 시)

 

main url에 대한 view 정의

from django.contrib import admin
from django.urls import path, include
from csapi import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('csapi.urls')),
    path('user/', include('login.urls')),
    path('', views.index, name='index'),
]

 

여기까지 django 에서 제공하는 auth app을 이용하여 login 기능을 구현했다. 현재는 직접 url 을 이동하며 login 페이지를 이동해야 하므로, 이를 수정한다.

 

templates/csapi 생성

$ mkdir -p templates/csapi

 

templates/csapi/main.html 작성

{% block content %}
<html>
    <head>
    </head>
    <body>
        {% if user.is_authenticated %}
            <a href="{% url 'login:logout' %}">{{ user.username }} (Logout)</a>
        {% else %}
            <a href="{% url 'login:login' %}">Sign In</a>
        {% endif %}
    </body>
</html>
{% endblock %}

 

csapi/views.py 수정

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return render(request, 'csapi/main.html')

 

login/urls.py 수정

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

app_name = 'login'

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

 

config/settings.py 에 logout 시 redirect url 지정

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/' # 추가

 

login / logout 테스트

- main 페이지 접속

 

- Sign In 클릭

 

- login 실패 시

 

- login 성공 시

 

- Logout 클릭 시

 

후기

로그인이 원래 엄청 어려운 작업이다. 진짜 nodejs에서 jwt로 로그인, 로그아웃, auth 기능 구현하려면 머리가 터질거 같다.

'프로젝트' 카테고리의 다른 글

[CSAPI] Django DB 스키마 설계  (0) 2021.10.05
[CSAPI] Django 회원가입 구현  (0) 2021.10.05
[CSAPI] Django login app 생성  (0) 2021.10.04
[CSAPI] Django csapi app 생성  (0) 2021.10.04
[CSAPI] Django containerization  (0) 2021.10.04
Comments