장고 - 로그인 권한 부여방법

방법1. login_required 클래스 사용

  • login_required 클래스를 사용하여 로그인이 필요한 부분에 @login_required 데코레이터를 사용한다.
    • 경로 : (앱 이름) > views.py
      1
      2
      3
      4
      # login_required 클래스 호출
      from django.contrib.auth.decorators import login_required
      # login_required 데코레이터 사용
      @login_required
  • 로그인 분기가 필요한 html 부분에 user.is_authenticated 함수를 사용한다.
    • 경로 : layout > base.html
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <title>{% block title %}{% endblock %}</title>
      </head>
      <body>
      {% if user.is_authenticated %}
      <a href="{% url 'account_logout' %}">Logout</a>
      {% else %}
      <a href="{% url 'account_login' %}">Login</a>
      {% endif %}
      {% block content %}
      {% endblock %}
      {% block extra_script %}
      {% endblock %}
      </body>
      </html>

방법2. 로그인 페이지 구현 및 LoginRequiredMixin 클래스 사용

  • 로그인 페이지 html을 작성한다.

    • 경로 : accounts(앱 이름) > templates > accounts > signin.html
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      {% extends 'base.html' %}

      {% block title %}
      {% endblock %}

      {% block content %}
      <div class="row">
      <div class="col"></div>
      <div class="col-6">
      <div class="alert alert-primary">Please enter your login information.</div>
      <form action="" method="post">
      {% csrf_token %}
      {{form.as_p}}
      <input type="submit" value="Signin" class="btn btn-outline-primary">
      </form>
      </div>
      <div class="col"></div>
      </div>
      {% endblock %}
  • accounts 앱에서 로그인/로그아웃/회원가입 경로를 설정한다.

    • 경로 : accounts(앱 이름) > urls.py
      1
      2
      3
      path('signin/', LoginView.as_view(template_name='accounts/signin.html'), name='signin'),
      path('signout/', LogoutView.as_view(template_name='accounts/signout.html'), name='signout'),
      path('signup/', signup, name='signup'),
  • LoginRequiredMixin 클래스를 상속받아 첫 페이지에 로그인 페이지로 이동되도록 한다.

    • 경로 : photo(앱 이름) > views.py
      1
      2
      3
      4
      5
      6
      from django.contrib.auth.mixins import LoginRequiredMixin
      # --> 로그인을 했는지 안했는지 확인해주고 로그인 안했으면, 로그인 페이지로 이동시켜줌(경로 설정 필요)

      class PhotoList(LoginRequiredMixin, ListView):
      model = Photo
      template_name = 'photo/photo_list.html'
  • 로그인 페이지 url 경로를 설정해준다.

    • 경로 : config(프로젝트명) > settings.py
      1
      2
      from django.urls import reverse_lazy
      LOGIN_URL = reverse_lazy('accounts:signin')