on
[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