여름의 서재

[Django] Auth 정복하기(2)_Login & Logout 본문

Skill/Django

[Django] Auth 정복하기(2)_Login & Logout

엉아_ 2021. 9. 26. 18:31
728x90

📄 유저 시나리오

- 로그인

1. 로그인 버튼을 누른다.

2. 로그인 폼이 담긴 페이지가 나온다.

3. 로그인 폼을 작성하여 제출 버튼을 누른다.

4. 로그인이 정상적으로 완료되면 메인페이지가 나온다.

 

- 로그아웃

1. 로그아웃 버튼을 누른다.

2. 로그아웃이 되고 메인페이지가 나온다.

 

🔨 기능 구현하기

1) urls

: accounts 앱에 login, logout이라는 이름의 주소 생성

 

from django.urls import path
from . import views

app_name = 'accounts'
urlpatterns = [
    path('login/', views.login, name='login'),
    path('logout/', views.logout, name='logout'),
    path('signup/', views.signup, name='signup'),

 

 

2) views

 

- Login

  • GET: 로그인 폼이 담긴 페이지를 응답
  • POST: 사용자 정보 받아서 유효성 검사 후 로그인
    • 로그인 == 세션 생성 후 DB에 저장
    • 유효성 검사 실패 시 에러 메세지 출력

(단, 로그인이 된 상태에서 login 함수를 실행하려한다면 바로 메인페이지로 이동)

from django.contrib.auth.forms import AuthenticationForm

def login(request):
    if request.user.is_authenticated:
        return redirect('articles:index')

    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/login.html', context)

 

AuthenticationForm

: 유저가 존재하는지를 검증하는 Django 내장 모델 폼

 

 

- Logout

  • POST: 세션 제거

(단, 로그인이 되지 않은 상태에서 logout 함수를 실행하려한다면 바로 로그인 페이지로 이동)

 

def logout(request):
    if not request.user.is_authenticated:
        return redirect('accounts:login')

    auth_logout(request) # 세션 제거 & requset.user 값 초기화
    return redirect('/articles/')

 

auth_logout (원래 logout)

: 현재 요청에 대한 db의 세션 데이터를 삭제하고 클라이언트 쿠키에서도 sessionid를 삭제하는 함수

 

 

3) templates

 

- login

: 로그인 폼이 담긴 페이지

{% extends 'base.html' %}

{% block content %}
  <h1>Login</h1>
  <form action="" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
  </form>
{% endblock content %}

 

Comments