본문 바로가기
학습 내용/Back-End

[freeCodeCamp] Django로 쇼핑몰 만들기 실습 - 5. 로그인 기능

by yein 2024. 12. 4.
강의 링크: 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 = '/'  # 로그아웃 성공 시 리다이렉트할 페이지