본문 바로가기

Web/Django

[Django] 로그인 권한 지정(login_required, LoginRequiredMixin)

와우.. Django로 개발을 하다보면 직접 구현할 필요 없이 Django에서 이미 구현된 기능이 생각보다 많음에 여러 번 놀라게 된다. 로그인(사용자 인증, 권한) 쪽을 보다보면 특히 자주 느끼는 것 같다.

 

내가 구현하고 싶었던 기능은 로그인 된 사용자에게만 제공되는 페이지에 로그인하지 않은 사용자가 접근하였을 때, 로그인 페이지로 연결되는 기능이었다.(로그인이 가능한 거의 모든 사이트에서 볼 수 있는 기능이다.) 이걸 어떻게 구현하나 생각하고 있었는데, 이미 Django에서는 제공하고 있는 기능이다.

 

https://docs.djangoproject.com/en/3.0/topics/auth/default/

 

Using the Django authentication system | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

Django Documentation에 자세히 나와 있다. 일단 필요한 부분만 쏙쏙 빼서 읽었다.


from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

 

먼저 @login_required 데코레이터를 이용하는 방법. 그러나 함수형 뷰에만 적용 가능하고 클래스형 뷰에는 사용할 수 없다.

 

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

 

그래서 나온 방법이 LoginRequiredMixin을 상속받는 방법이다. Mixin은 Django 뿐만 아니라 객체지향프로그래밍 전반에서 쓰이는 개념이라고 하는데 처음 들어봤다.ㅜ_ㅜ 여러 컴포넌트에서 재사용이 가능한 기능들을 정의하고 있는 것을 Mixin이라고 한다. Django에서 클래스뷰가 빛을 발하는 것이 바로 이 Mixin을 이용한 확장이 용이하기 때문이라고 한다! 자세한 내용은 더 공부가 필요하므로 일단 LoginRequiredMixin 기능을 사용함으로써 살짝만 맛보고자 한다.

 

사용법은 LoginRequiredMixin을 import한 뒤 클래스형 뷰에서 상속받기만 하면 된다.

login_url 변수에는 login 페이지의 url을 넣어주면 된다.

redirect_field_name이 약간 생소한데, redirect_field_name을 설정해주지 않으면 로그인 후 redirect될 페이지의 url이 next라는 필드명으로 담기게 된다. redirect_field_name을 설정해주면 이 필드명을 변경해주는 것.

 

LoginRequiredMixin을 이용해서 정말 간단하게 뷰에 로그인 권한을 지정할 수 있었다:)

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

[Django] 클론 코딩하기  (0) 2020.02.17