Meme's IT

[Django] 로그인(1) 로그인, 로그아웃 본문

BackEnd/Django

[Django] 로그인(1) 로그인, 로그아웃

Memez 2023. 10. 4. 17:13

# Django Authentication System

사용자 인증과 관련된 기능을 모아 놓은 시스템

이 기능을 통해, 로그인 / 로그아웃을 구현할 수 있다.

 


# 사전 작업

0. https://memezz.tistory.com/24에서 작성한 프로젝트에서 이어집니다..

 

1. 'accounts' app생성

django 내부에서 쓰이는 함수에서도 accounts라는 이름으로 사용되기 때문에 app이름은 accounts로 하는 것이 권장됨

# accounts/urls.py

from django.urls import path
from . import views

app_name = 'accounts'
urlpatterns = [

]
# crud/urls.py
# 프로젝트 urls에도 경로 추가

urlpatterns = [
	path('accounts/', include('accounts.urls')
]

 

2. Custom User model로 대체하기

더보기

# django에는 기본적으로 제공하는 user model이 있음

settings.py > INSTALLED_APPS를 확인해보면 'django.contrib.auth'라는 앱이 그 역할을 함

 

근데 왜 굳이 대체해서 써야할까?

→ 개발자가 직접 수정하기가 힘들기 때문에 상속받아서 수정할 애들만 수정하는 형식으로 사용해준다!

 

2 - 1. AbstractUser을 상속받는 커스텀 User 클래스 생성

# accounts/models.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
	pass	# 당장은 수정할 게 없으니 우선 pass

 

2 - 2. 새로 작성한 커스텀 User가 사용할 User라는 사실을 알려주기

# settings.py

AUTH_USER_MODEL = 'accounts.User'

 

2 - 3. admin 사이트에서도 확인하기 위해 추가해주기

# accounts/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)
☆주의☆
프로젝트 중간에는 AUTH_USER_MODEL을 변경할 수 없음!!!
만약, 이미 프로젝트가 진행되고 있다면, DB를 초기화 후 진행

그러므로 꼭! 프로젝트 진행 전에 User 모델을 대체해줘야 함

# 로그인 구현해보기

login = Session을 만드는 과정

로그인 인증에 사용할 데이터를 입력 받는 built-in form인 AuthenticationForm()을 이용해서 구현

 

1. url부터 작성

# accounts/urls.py

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

 

2. views.py에서 login 함수 만들어주기 

AuthenticationForm먼저 import해주고 작성

# accounts/views.py

from django.contrib.auth.forms import AuthenticationForm

def login(request):
    if request.method == 'POST':
        pass
    else:
        form = AuthenticationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/login.html', context)

 

3. Template/accounts 위치에 login.html 생성 및 작성

<h1>로그인</h1>
<form action="{% url "accounts:login" %}" method="POST">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit">
</form>

로그인 화면을 확인할 수 있다.

 

4. login 함수 완성하기

from django.contrib.auth import login as auth_login		# 내장함수 login을 import해주기

def login(request):
    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)

5. 로그인 링크 만들기

(앞 프로젝트와 이어지므로 articles/index가 메인페이지, 이어지지 않는다면 다른 메인페이지에서 링크 만들어주기)

<!-- articles/index.html에 추가해주기 -->

<a href="{% url "accounts:login" %}">LOGIN</a>

# 로그아웃 구현해보기

logout = 세션을 지워주는 과정

1. url작성

# accounts/urls.py

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

 

2. views.py에서 logout 함수 만들어주기

더보기

logout(request)함수

  • 현재 요청에 대한 Session Data를 DB에서 삭제
  • 클라이언트의 쿠키에서도 Session ID를 삭제
from django.contrib.auth import logout as auth_logout	# 로그아웃함수 import

def logout(request):
    auth_logout(request)
    return redirect('articles:index')

 

3. articles/index.html에 로그아웃 버튼만 만들어주기(html따로 필요없음)

하지만, DB를 건들이는 역할을 하므로 a태그가 아닌, form을 이용해서 POST방식 + 토큰을 이용해서 만들어 줘야한다.

<form action="{% url "accounts:logout" %}" method="POST">
 	{% csrf_token %}
	<input type="submit" value="LOGOUT">
</form>

 

 


 

# 참고: html에서 로그인된 유저이름 출력하는 방법

<h3>{{ user.username }}님 안녕하세요!</h3>

{{user.username}} 태그를 이용하면 현재 로그인된 유저의 이름을 출력할 수 있다.

 

'BackEnd > Django' 카테고리의 다른 글

[Django] 로그인(3) 비밀번호 바꾸기  (0) 2023.10.05
[Django] 로그인(2) 가입/탈퇴/수정  (0) 2023.10.05
[Django] 쿠키와 세션  (0) 2023.10.04
[Django] Static Files & Media Files  (0) 2023.10.04
[Django] view 함수 update  (0) 2023.10.04