(06.17) 수정됨.
이번에는 로그인과 로그아웃을 구현해볼 것이다.
거기에 더해 이런 페이지 방문시 노출하는 과정도 구현해야 하는데, 이를 위해 템플릿을 추가하는 것도 함께할 것이다.
콘솔 실행하기
예제를 따라하기 위해서는 cmd 콘솔을 실행해야 한다.
콘솔 실행 방법을 모른다면 패키지 설치와 프로젝트 설치 및 실행 방법을 보고 오자.
app 추가하기
app 생성
로그인과 로그아웃 페이지를 "user"라는 이름의 app을 생성한다.
(django-sample) C:\WhiteSeolpyo\django-sample\django_sample>python manage.py startapp user
apps.py 수정하기
class명이 "UserConfig"로 자동생성되었을 텐데, "Config"로 변경한다.
이 값을 직접 str로 설정에 입력해야하는데, app마다 서로 다른 class명을 사용하면 하나하나 확인해야하는 것이 번거롭기 때문이다.
# user/apps.py
from django.apps import AppConfig
class Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'user'
app 추가하기
settings에서 apps.py에 user app을 추가해준다.
app 추가를 위해 apps.py에 존재하는 class까지의 경로를 입력했다.
# config/settings/local/apps.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# user app 추가
'user.apps.Config',
]
template 만들기
templates 폴더 생성
manage.py와 같은 위치에 "templates"라는 이름의 폴더를 만든다.
트리 구조로 표현하면 다음과 같다.
...
|- manage.py
|- db.sqlite3
|- config
| |- ...
|- user
| |- ...
|- templates
base 템플릿 작성
"base.html"을 다음과 같은 내용으로 작성한다.
"request.user.is_anonymous"라는 값을 기준으로 방문자의 로그인 여부를 확인할 수 있고,
"request.user.is_staff"라는 값을 통해 로그인한 이용자가 관리자인지 확인할 수 있다.
"{% block content %}"는 base.html을 상속받는 템플릿에서 content block에 해당하는 영역에 내용을 추가할 수 있게 해준다.
# templates/base.html
<head>
</head>
<body>
<div>
<a href="/">홈페이지로 이동</a>
</div>
<hr>
<div>
{% if request.user.is_anonymous %}
<a href="{% url 'user:login' %}">로그인</a>
{% else %}
<p>"{{ request.user }}"{% if request.user.is_staff %}(관리자){% endif %}</p>
<form method="post" action="{% url 'user:logout' %}">
{% csrf_token %}
<input type="submit" value="로그아웃">
</form>
{% endif %}
</div>
<hr>
<div>
{% if messages %}
<ul>
{% for message in messages %}
<li class="{{ message.tags }}">
{{ message }}
</li>
{% endfor %}
</ul>
<hr>
{% endif %}
</div>
<div>
{% block content %}
{% endblock %}
</div>
</body>
form 템플릿 작성
"form.html"도 다음과 같이 작성해준다.
# templates/form.html
{% extends 'base.html' %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="제출">
</form>
{% endblock %}
홈페이지 템플릿 작성
홈페이지 템플릿을 다음과 같이 작성하고, "home.html"이라는 이름으로 작성한다.
# templates/home.html
{% extends 'base.html' %}
{% block content %}
<div>
Home Page.
</div>
{% endblock %}
template dir 추가하기
settings의 templates.py를 찾아 다음과 같이 DIRS에 새로 만든 templates 폴더 경로를 추가한다.
여기에 폴더 경로가 추가되어있지 않으면 템플릿이 존재하더라도 가져오지 못한다.
# config/settgins/local/templates.py
from .base import BASE_DIR
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
# tempaltes 폴더 추가
BASE_DIR / 'templates',
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
user view 구현하기
user view 작성하기
user app의 views.py의 내용을 다음과 같이 작성한다.
# user/views.py
from django.contrib.auth import views
from django.contrib.auth.forms import AuthenticationForm
class LoginView(views.LoginView):
form_class = AuthenticationForm
template_name = 'form.html'
# 로그인시 홈페이지로 이동
next_page = '/'
class LogoutView(views.LogoutView):
# 로그아웃시 홈페이지로 이동
next_page = '/'
user url 작성하기
"urls.py"라는 파일을 만들고, 다음과 같이 내용을 채운다.
app_name과 url pattern의 name은 서로 조합하여 사용된다.
예를 들어 "user:login"이라는 url을 찾으면 user app의 login이라는 이름을 가진 url을 가져오게 된다.
# user/urls.py
from django.urls import path
from . import views
app_name = 'user'
urlpatterns = [
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
]
config view 구현하기
홈페이지 view 만들기
config 폴더에 "views.py" 파일을 만들고, 다음과 같이 내용을 작성한다.
이 코드를 통해 방문자가 홈페이지에 접근한 경우 home.html을 렌더링한 결과를 보여주게 된다.
# config/views.py
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
url 추가하기
"urls.py"에 홈페이지와 user/ 디렉토리에 접근했을 때 수행할 작업을 추가해준다.
# config/urls.py
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
# 홈페이지 접속시 수행할 작업
path('', views.home),
# user/ 디렉토리 접근시 user app url을 사용하도록 설정
path('user/', include('user.urls')),
]
접속해보기
홈페이지
"python manage.py runserver" 명령을 실행한 다음 "127.0.0.1:8000"으로 접속해보면 다음과 같이 렌더링된 홈페이지를 확인할 수 있다.
로그인해보기
로그인 url로 이동하면 다음과 같은 서식 입력 페이지가 나타난다.
로그인 정보가 유효하지 않으면 다음과 같이 에러 메세지가 노출되는 것을 확인할 수 있다.
로그인한 화면
로그인하면 다음과 같이 현재 접속한 사용자명과 로그아웃 버튼이 노출된다.