[CSAPI] Django login, logout 구현

[CSAPI] Django login, logout 구현

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 login page

user/login url 접속 테스트

login.html 수정

{% block content %} {% csrf_token %} {% if form.errors %} {% for field in form %} {% for error in field.errors %} {{ field.label }} {{ error }} {% endfor %} {% endfor %} {% for error in form.non_field_errors %} {{ error }} {% endfor %} {% endif %} 사용자ID 비밀번호 로그인 {% 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 %} {% if user.is_authenticated %} {{ user.username }} (Logout) {% else %} Sign In {% endif %} {% 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 기능 구현하려면 머리가 터질거 같다.

from http://not-to-be-reset.tistory.com/519 by ccl(A) rewrite - 2021-10-05 14:00:32