작정하고 Django 22강 - Login/Logout 구현

_·2023년 8월 4일

작정하고 Django 강의

목록 보기
21/44

Login view & Logout view 사용

AccountCreateView와 같이 원래는 어떤 특정 view를 상속 받은 다음 설정할 파라미터를 넘겨주는 식으로 진행했음
Login, Logout view 따로 거창하게 작성해줘야할 필요는 없음
바로 urls.py로 장고에서 제공해주는 login view, logout view를 가져와서 작성해도 됨
AccountCreaView와는 다르게 login, logout view는 직접 만들 template을 따로 지정을 해줘야 함
장고에서 기본적으로 제공해주는 'User'를 사용한다면 다음과 같이 간단하게 작성 가능

# pragmatic/accountapp/urls.py

from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path
from accountapp.views import hello_world, AccountCreateView

app_name = "accountapp"

urlpatterns = [
    path('hello_world/', hello_world, name='hello_world'),

    path('login/', LoginView.as_view(template_name = 'accountapp/login.html'), name='login'), # 추가

    path('logout/', LogoutView.as_view(), name='logout'), # 추가

    path('create/', AccountCreateView.as_view(), name='create'),
]

html 만들기

login.html 작성
계정 접속 하기 위해 일단 account/create로 가서 계정 만든 이후 로그인

{% extends 'base.html' %} <!-- extends 를 이용하여 base 가져오기 -->

{% block content %}

<div style="text-align: center">
  <div>
    <h4>Login</h4>
  </div>
  <div>
    <form action="" method="post">
      {% csrf_token %}
      {{ form }}
      <input type="submit" class="btn btn-primary">
    </form>
  </div>
</div>

{% endblock%}

아무런 설정을 하지 않았다면 로그인 이후 account/profile로 이동

login, logout 에서 redirect 경로를 찾는 매커니즘

get, post 파라미터 중 next라는 이름을 가진 value를 찾기
next가 존재한다면 그곳으로 감
하지만 next가 없다면, 우리의 프로젝트 폴더인 pragmatic에서 setting 안에 있는 LOGIN_REDIRECT_URL이라는 부분의 경로를 찾고 있다면 그곳으로 감
LOGIN_REDIRECT_URL도 없다면, Default로 적용된 곳으로 감(우리의 예제에서는 'account/profile')

로그인 창으로 들어가는 것을 만들어주기

header.html파일에서 nav4를 login으로 변경해줌

그 Login을 a(anchor) 태그로 감싸 우리가 만든 login 페이지 경로로 갈 수 있도록 url 기입
{% url 'accountapp:login' %}
<a href="{% url 'accountapp:logout' %}">

분기문을 넣어 유저라는 것을 판단해주고 is_authenticated 구문 사용
유저가 로그인이 돼있지 않다면, login을 화면에 보여주고 : {% if not user.is_authenticated %}
유저가 로그인이 되어있다면, logout 을 화면에 보여줌 : {% else %}

login, logout을 완성하고 나서 다시 갈 경로 next를 얻어줘야 하기 떄문에 get 방식으로 next 라는 값을 넘겨줌
?next= {{ request.path }} : request.path 라는 인자를 넘겨줄 것
우리가 만든 모든 페이지에서 그 url을 next라는 인자로 넘겨줌으로써, login한 이후 우리가 원래 있었던 자리로 돌아올 수 있는 것

<!-- pragmatic/templates/header.html -->

    <div class="pragmatic_header">
       <div>
            <h1 class="pragmatic_logo">Prgmatic</h1>
       </div>
        <div>
            <span>nav1</span>
            <span>nav2</span>
            <span>nav3</span>
            
            {% if not user.is_authenticated %}
            <a href="{% url 'accountapp:login' %}?next= {{ request.path }}">
                <span>login</span>
            </a>
            {% else %}
            <a href="{% url 'accountapp:logout' %}?next= {{ request.path }}">
                <span>logout</span>
            </a>
            {% endif %}
        </div>
    </div>

logout 누르기

문제

next 라는 인자 없이 직접 account/login이라는 경로로 로그인을 시도했을 때 여전히 account/profile이라는 디폴트 값의 경로로 가지는 문제가 발생.

LOGIN_REDIRECT_URL 설정으로 해결

# pragmatic/pragmatic/settings.py

from django.urls import reverse_lazy

... 

# 맨 아래에 다음 코드 추가
LOGIN_REDIRECT_URL = reverse_lazy('accountapp:hello_world')
LOGOUT_REDIRECT_URL = reverse_lazy('accountapp:login')

account/login이라는 url로 바로 접속 후 로그인 시도
settings.py에 설정해두었던 hello_world로 돌아오는 것을 확인할 수 있다.

Commit

0개의 댓글