Django 데코레이터 설정
졸업작품 중개 서비스로써 회원들은 작가 혹은 일반 회원(구매자)로 나눠져 있다.
작가들을 위한 페이지/기능(작품 등록, 작품 수정, 작품 삭제, 구매자의 작품 가격 제안 수락)이 있는데,
이를 위해 작가 데코레이터가 필요하였다.
Django Decorator
데코레이터란 위 상황처럼 작가의 권한을 부여 받은 사람만이 기능을 사용할 수 있게끔 제한을 두는 것이다.
특히, 데코레이터는 Python에서 제공하는 기능이다.
이는 하나의 함수이다. 간혹가다 파이썬으로 구현한 프로젝트에서 '@login_required' 를 많이 볼 수 있다.
@login_required를 작성해주면 로그인된 경우만 해당 함수가 실행되고, 비로그인 상태이면 로그인 화면으로 이동하게 한다.
따로 함수를 사용하지 않고 Python에 내장되어 있는 기능이라는게 새삼 놀랍다. 로그인 화면으로 이동까지 해준다니,,!
출처
https://bio-info.tistory.com/172
[Django] login_required 3가지 구현 방법 (AOP, Decorator)
Contents 1. 배경 장고에서는 다양한 방법으로 로그인한 유저만 허용하도록 할 수 있습니다. 예를 들어, 커뮤니티 웹사이트에서 글 목록까진 볼 수 있지만, 글을 보려면 로그인해야 볼 수 있게 할
bio-info.tistory.com
@login_required와 같이 작가로서 인증된 유저에게만 특정한 기능 및 페이지 이용 권한을 줄 수 있도록 데코레이터 설정을 한다.
# accounts/decorators.py
from django.conf import settings
from django.shortcuts import redirect, get_object_or_404
from django.contrib.auth import get_user_model
from .models import User
from django.contrib import messages
from django.http import HttpResponse
def artist_required(function):
def wrap(request, *args, **kwargs):
if request.user.is_creater:
return function(request, *args, **kwargs)
messages.info(request, "접근 권한이 없습니다.")
return redirect("/")
return warp
accounts의 decorator.py 라는 파일로 urls.py, models.py와 같은 위치에 생성해두었다.
이것 저것 시도해보느라 import한 것들은 많지만 사실상 쓰인건 별로 없다!
from .models import User
먼저 User 모델의 is_creater로 작가임을 확인해줘야 하기 때문에 User 모델을 불러온다.
def artist_required(function):
def wrap(request, *args, **kwargs):
작가 권한을 함수로 만들어주고 또 그 안에 wrap이라는 함수를 만들어 조건에 맞는 함수를 정의하도록 한다.
warp 함수의 인자를 request, *args, **kwargs로 받는 이유는 dispatch()라는 메소드가 request, *args, **kwargs 라는 인자를 받기 때문이다. dispatch() 해당하는 url로 연결요청이 왔을 때, 실행되는 메소드 라고 한다. (login_required와 같은 로직으로 사용)
출처
[Python / Django] Decorator(데코레이터) 사용하기
1. Decorator란? 함수를 Wrapping 하는 기법으로 반복되는 코드를 줄일 수 있다는 장점이 있습니다. 물론...
blog.naver.com
더 자세하게 말해보자면 *args는 여러 개의 인자를 함수로 받고자 할 때 사용된다.
여러 개의 인자를 받을 때에는 튜플 형식으로 받는다.
즉, 함수로 받고자 하는 인자가 정확히 몇개인지 모를 때 사용한다. (이를 '가변인자'라고 한다.)
여기서 args는 arguments의 약자이다.
**kwargs는 keyword arguments의 약자로,
딕셔너리 형태인 {'키워드': '특정 값'}으로 함수 내부로 전달된다고 한다.
*args와 **kwargs를 같이 쓸 때 키-값 형태의 인자를 주면 파이썬은 자동으로 kwargs에 저장해준다고 한다.
결국 *args와 **kwargs는 모두 가변인자를 받기 위해 사용되는 것이다.
다시 본론으로 돌아와 함수를 정의한다.
if request.user.is_creater:
return function(request, *args, **kwargs)
messages.info(request, "접근 권한이 없습니다.")
return redirect("/")
return warp
accounts 앱의 모델에서 설정한 'is_creater' 라는 필드를 사용하여 작가임을 확인한다.
'is_creater'는 학교 이메일로 작가임을 인증하면 True 값으로 바뀐다.
이 필드를 사용하여 작가 권한을 부여하도록 한다.
만약 작가가 아니라면 '/' 페이지로 이동하게 되어 있는데 이는 맨 처음 페이지에 입장할 때의 메인 페이지로 돌아가도록 설정해놓은 것이다.
message를 사용하여 유저에게 잘못된 접근임을 알려주려 하였지만
views.py에서 message를 사용하지 않아 바로 메인 화면과 로그인 화면으로 넘어가게 되었다!
# .../views.py
from accounts.decorators import artist_required
...
@arartist_required
def...
이제 다른 앱의 views.py 에서 직접 만들어준 데코레이터를 사용하여 유저 권한을 부여하도록 한다.