[django] 점프 투 장고 - 장고 심화 5

Joy·2020년 6월 23일
1

Django | 점프투장고

목록 보기
14/22

로그인

장고의 로그인, 로그아웃을 도와주는 앱 django.contrib.auth
장고 프로젝트 생성시 config / settings에 자동으로 추가됨

이걸 이용해서 로그인/로그아웃 구현하기

common 앱

pybo앱에 로그인/로그아웃 구현하면 관리 어려우니까 새 앱common에 구현하자

새 앱 생성

(mysite) c:\projects\mysite>django-admin startapp common
하면 앱 구조의 디렉토리 및 파일 자동으로 생성됨.

새 앱 config에 등록 및 필요 파일 생성

  • config/setting에
INSTALLED_APPS = [
    'common.apps.CommonConfig',
    ]
  • config/urls.py 수정 -> common앱의 urls.py를 사용하기 위해
    urlpatterns 에 추가 : http://localhost:8000/common/ 으로 시작하는 URL은 common/urls.py를 참조

  • common/urls.py 생성 및 작성

로그인

common앱 이용해서 로그인 기능 구현

  • navbar.html "로그인"잉크 변경하기
    {% url 'common:login' %}

로그인 url

common/url.py 수정

-'login' path를 추가

  • 뷰는 따로 만들 필요없이 위 코드처럼 django.contrib.auth의 LoginView를 사용
from django.urls import path
from django.contrib.auth import views as auth_views

app_name = 'common'

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

로그인 템플릿

로그인 템플릿 작성

django.contrib.auth 패키지는 로그인 기능은 제공하지만 템플릿은 따로 제공하지 않음

  • jango.contrib.auth 패키지가 사용하는 로그인 템플릿 경로를 수정
    common앱에서 동작하므로 registration/login.html 템플릿을 생성하기 보다는 common/login.html 템플릿을 생성하는 것이 관리하기 편하니까.

  • common/login.html 템플릿 생성 및 작성
    탬플릿 dir에서 common앱용 dir 만들고 템플릿 파일 작성하기

{% extends "base.html" %}
{% block content %}
<div class="container my-3">
    <form method="post" class="post-form" action="{% url 'common:login' %}">
        {% csrf_token %}
        {% include "form_errors.html" %}
        <div class="form-group">
            <label for="username">사용자ID</label>
            <input type="text" class="form-control" name="username" id="username"
                   value="{{ form.username.value|default_if_none:'' }}">
        </div>
        <div class="form-group">
            <label for="password">비밀번호</label>
            <input type="password" class="form-control" name="password" id="password"
                   value="{{ form.password.value|default_if_none:'' }}">
        </div>
        <button type="submit" class="btn btn-primary">로그인</button>
    </form>
</div>
{% endblock %}

베이스 파일 익스텐션하고 블록 콘텐츠에 작성하기
컨테이너 디브 안에 폼 하나 만들고 액션 url 주기
form_error.html 템플릿 파일 인클루드하기.
로그인에 사용되는 사용자이름(username)과 비밀번호(password)는 django.contrib.auth 가 필요로 하는 필수항목

  • form_error.html 작성
    form_errors.html 템플릿은 로그인 실패시에 어떤 이유로 로그인이 실패했는지에 대해서 알려주는 역할
{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}  <!-- 필드 오류를 출력한다. -->
            <div class="alert alert-danger">
                <strong>{{ field.label }}</strong>
                {{ field.errors }}
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}   <!-- 넌필드 오류를 출력한다. -->
        <div class="alert alert-danger">
            <strong>{{ error }}</strong>
        </div>
    {% endfor %}
{% endif %}

필드, 넌필드 오류 모두 표시하도록. 작성함

  • 필드 오류 : 사용자가 입력한 필드 값에 대한 오류로 값이 누락되었거나 필드의 형식이 일치하지 않는 경우
  • 넌필드 오류: 필드의 값과는 상관없이 다른 이유로 발생하는 오류

로그인 수행

url 과 오류 띄워주는 화면

지금 있는 admin아이디로 로그인하면 django.contrib.auth 패키지는 디폴트로 /accounts/profile/ 라는 URL로 이동함.
그러나 index 페이지로 이동되도록 바꾸기

로그인 성공 url

settings.py

LOGIN_REDIRECT_URL = '/' 코드에 추가

ROOT url

config/urls.py

  • / path 추가
    http://localhost:8000/ 와 같은 요청이 들어오면 위에 추가한 path('', views.index, name='index') 문장에 의해 pybo/views.py의 index함수가 실행되게
from pybo import views
urlpatterns = [
    
    path('', views.index, name='index'),  # '/' 에 해당되는 path



로그아웃

navbar에 로그인/로그아웃 링크가 번갈아 보이게 수정하기

{% if user.is_authenticated %}
<a class="nav-link" href="{% url 'common:logout' %}">{{ user.username }} (로그아웃)</a>
{% else %}
<a class="nav-link" href="{% url 'common:login' %}">로그인</a>
{% endif %}

if를 넣어서 로그인 한 상태면 username과 로그아웃을 보여주고 로그아웃 링크걸기.
아니면 로그인 보여주기

common/urls.py

로그아웃 링크({% url 'common:logout' %})에 대한 path 추가하기

`path('logout/', auth_views.LogoutView.as_view(), name='logout'),

로그아웃 성공 url

로그인 처럼 로그아웃하고 바로 index로 이동하는 url도 추가해주기

config\settings.py

LOGOUT_REDIRECT_URL = '/'

profile
roundy

0개의 댓글