강의 링크: Learn Django by Building an Online Marketplace – Python Tutorial for Beginners
# LoginView를 사용하여 빠르게 로그인 로직 구현하기
회원가입 뷰를 만들 때와 동일한 방식으로 로그인 뷰도 만들어준다. 일단 폼이 필요하니까 forms.py에 다음과 같이 AuthenticationForm를 상속 받는 LoginForm을 추가해준다.
class LoginForm(AuthenticationForm):
username = forms.CharField(widget=forms.TextInput(attrs={
'placeholder': 'Your username',
'class': INPUT_STYLE
}))
password = forms.CharField(widget=forms.PasswordInput(attrs={
'placeholder': 'Your password',
'class': INPUT_STYLE
}))
다음과 같이 login.html 파일을 생성하여 로그인 템플릿도 추가해준다.
{% extends "core/base.html" %}
{% block title %}
Log in
{% endblock title %}
{% block content %}
<div class="w-1/2 my-6 mx-auto p-6 bg-gray-100 rounded-xl">
<h1 class="mb-6 text-3xl text-center">Log in</h1>
<form method="post" action="{% url 'core:login' %}">
{% csrf_token %}
<div class="mb-3">
<label class="inline-block mb-2">Username</label>
<br>
{{ form.username }}
</div>
<div class="mb-3">
<label class="inline-block mb-2">Password</label>
<br>
{{ form.password }}
</div>
{% if form.errors or form.non_field_errors %}
<div class="mb-3 p-6 bg-red-100 rounded-xl">
{% for field in form %}{{ field.errors }}{% endfor %}
{{ form.non_field_errors }}
</div>
{% endif %}
<button type="submit"
class="py-4 px-8 text-lg bg-teal-500 hover:bg-teal-700 rounded-md">Log in</button>
</form>
</div>
{% endblock content %}
views.py에는 다음과 같이 로그인 뷰를 정의해준다. 회원가입 뷰(signup)를 정의할 때와 달리 사용자의 폼 제출을 처리하는 로직을 따로 작성하지 않아도 된다. 이유는 곧 알려드림ㅎ
def login(request):
form = LoginForm()
return render(request, 'core/login.html', {
'form': form
})
urls.py의 urlpatterns에는 다음 코드 추가.
urlpatterns = [
# ...생략
path('login/', views.login, name='login')
]
뻥이고 다음 코드 추가 ㅎ
urlpatterns = [
# ...생략
path('login/', auth_views.LoginView.as_view(template_name='core/login.html',
authentication_form=LoginForm), name='login')
]
물론 다음과 같이 필요한 모듈들을 import 해와야 한다. 이때 이 파일에 이미 views라는 이름의 대상이 존재하기 때문에 django.contrib.auth.views는 auth_views라든지 아무튼 중복되지 않는 변수로 개명?해서 써야 된다.
이 auth_views.LoginView 덕분에 views.py에서 별도의 폼 제출 처리 로직을 작성하지 않아도 되는 것이다. 이 클래스 기반 뷰 안에 이미 로그인 동작을 처리하는 로직이 포함되어 있기 때문이다. 물론 커스터마이징도 지원한다.
참고로 회원가입의 경우에는 이렇게 내장된 뷰가 없어서 직접 폼 제출 처리 로직을 작성했던 것인데, 내장된 뷰가 없는 이유는 로그인 로직과 달리 회원가입 로직은 서비스마다 요구사항이 많이 다를 수 있기 때문이라고 한다.
이렇게 하고 /login 페이지로 접근하여 로그인을 하면, 정상적으로 로그인 정보를 입력한 경우 다음과 같이 /accounts/profile 페이지로 리다이렉트 되어버려서 404 에러가 발생하는 것을 볼 수 있다. 로그인에 성공하면 auth_views.LoginView가 기본적으로 이와 같이 /accounts/profile 페이지로 리다이렉트 시켜버리는데, 실습에선 이 경로에 해당하는 뷰를 만들지 않았기 때문에 404가 떠버린 것이다.
실습에선 /accounts/profile 페이지를 만들 계획이 없기 때문에 로그인 성공시의 리다이렉트 페이지 설정을 변경해 줄 필요가 있다.
settings.py에 다음과 같이 LOGIN_REDIRECT_URL 값으로 리다이렉트 시킬 경로를 지정해주면 오버라이드 됨~
LOGIN_URL = '/login/' # 권한 없는 페이지 접근할 경우 리다이렉트할 페이지
LOGIN_REDIRECT_URL = '/' # 로그인 성공 시 리다이렉트할 페이지
LOGOUT_REDIRECT_URL = '/' # 로그아웃 성공 시 리다이렉트할 페이지
'학습 내용 > Back-End' 카테고리의 다른 글
[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 6. SQLite (1) | 2024.12.10 |
---|---|
[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 4. 회원가입 기능 (0) | 2024.12.04 |
[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 3. 어드민 페이지 (1) | 2024.11.25 |
[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 2. 뷰(view) 만들기 (0) | 2024.11.24 |
[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 1. 프로젝트 생성하기 (0) | 2024.11.22 |