urls.py
from user.views import LoginView, LogoutView
urlpatterns = [
path('login/',LoginView.as_view(),name="loginview"),
path('logout/',LogoutView.as_view(),name="logoutview"),
]
기본적인 urls.py를 추가해 준 내용으로 login과 logout부분을 연결해 주었습니다.
뷰 만들기
LoginView
from django.urls import reverse_lazy
from django.http import HttpResponseRedirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.views import LoginView, LogoutView
from django.contrib import messages
from user.forms import CustomLoginForm
class LoginView(LoginView): # 로그인
authentication_form = CustomLoginForm
template_name = 'user/login.html'
def form_invalid(self, form):
messages.error(self.request, '아이디(로그인 전용 아이디) 또는 비밀번호를 잘못 입력했습니다. \n입력하신 내용을 다시 확인해주세요.', extra_tags='danger')
return super().form_invalid(form)
def form_valid(self, form):
# 로그인이 성공하면 리디렉션할 URL
redirect_to = reverse_lazy('main')
# 사용자 인증
user = form.get_user()
authenticated_user = authenticate(
username=user.username,
password=form.cleaned_data.get('password')
)
if authenticated_user is not None:
# 로그인 성공 시 세션에 사용자 정보를 저장합니다.
login(self.request, authenticated_user)
return HttpResponseRedirect(redirect_to)
return super().form_invalid(form)
사용자가 로그인을 시도할 때 호출 되며 CustomLoginForm이라는 사용자 정의 로그인 폼을 사용하여 로그인을 처리합니다.
이 클래스에서 form_valid() 메서드는 사용자가 제출한 로그인 폼이 유효할 경우 실행됩니다. 사용자 인증이 성공하면 login 함수를 호출하여 현재 요청객체와 함께 사용자를 인증하고 인증된 사용자를 main 페이지로 리디렉션 합니다.
만약 인증이 실패하면 form_invalid 메서드가 호출되어 오류메시지와 함께 폼을 다시 보여줍니다.
LogoutView
class LogoutView(LogoutView):
next_page = reverse_lazy('loginview') # 로그아웃 시 리디렉션할 URL
def get_next_page(self):
next_page = super().get_next_page()
messages.success(self.request, '로그아웃되었습니다.', extra_tags='success')
return self.next_page
Django의 인증 시스템을 사용하여 사용자가 로그아웃할 때 호출되는 LogoutView클래스를 확장하는 코드입니다.
next_page는 로그아웃 후 리디렉션될 URL을 저장하는 속성입니다. reverse_lazy함수를 사용하여 loginview의 URL을 가지고 와 저장하였습니다.
get_next_page메서드는 로그아웃 후 리디렉션될 URL을 반환하는 메서드입니다. 부모클래스인 get_next_page 메서드를 호출하여 로그아웃 후 리디렉션될 URL을 가지고 온 다음 메시지를 추가합니다
마지막으로 self.next_page를 반환하여 loginview로 리디렉션 해줍니다.
아이디 비밀번호 입력
HTML
<div class="input_login">
<div class="input_login_id_box">
{{ form.username }}
</div>
<div class="input_login_password_box">
{{ form.password }}
</div>
</div>
HTML에서 로그인 폼을 구성하는 데 사용되는 부분입니다.
{{ form.username }} 과 {{ form.password }}는 Django의 폼 기능을 사용하여 생성된 로그인 폼에서 사용자 이름 및 비밀번호 입력필드를 나타냅니다. 아래에 forms.py에 대해서 나옵니다.
forms.py
from django import forms
from django.contrib.auth.forms import AuthenticationForm
class CustomLoginForm(AuthenticationForm):
username = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Username'}))
password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'Password'}))
Django의 내장 폼 클래스 AuthenticationForm을 상속하여 커스텀 로그인 폼을 만든 부분입니다.
username과 password는 AuthenticationForm을 상속받은 필드로 TextInput과 PasswordInput을 위젯으로 사용하였습니다.
위젯은 해당 필드의 랜더링 방법을 지정하는 것으로 TextInput는 일반적인 텍스트 입력을 PasswordInput은 비밀번호 입력 필드를 위한 이젯입니다.
attrs는 위젯에 적용된 속성들을 정의하는 부분입니다. class부분을 form-control로 지정하여 사용자가 입력할 수 있는 값의 유형을 나타내는 placeholder text를 지정하였습니다.
message 출력
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
message 프레임 워크를 사용하여 사용자에게 정보, 성공, 경고, 오류 메시지와 같은 메시지를 보여줄 수 있습니다.
만약 message가 있을 경우 해당 메시지를 리스트 아이템으로 표시하는 html 코드를 생성하는 구문입니다.
message.tags가 존재하는 경우 class에 message.tag를 넣어주고 message의 내용을 출력해 줍니다.
인증 상태에 따른 연결 요청 처리
{% if user.is_authenticated %}
<div class="navbar_login_text"><a href="/logout">로그아웃</a></div>
{% else %}
<div class="navbar_login_text"><a href="/login">로그인</a></div>
{% endif %}
현재 인증된 사용자가 있으면 로그아웃을 표시해 주고 없을 경우 로그인을 표시해 주는 문장입니다.
'BackEnd > Django, DRF' 카테고리의 다른 글
Django - pipenv로 패키지 관리, 사용 (0) | 2023.04.18 |
---|---|
Django - environ을 이용한 환경 변수 관리 (0) | 2023.04.18 |
user/models.py - user모델 만들기 (0) | 2023.03.21 |
HTML에서 보낸 데이터 어드민 사이트에서 수락 거절 기능 (0) | 2023.02.23 |
QuerySet의 값들을 쿠키에 저장하기 (0) | 2023.02.23 |