졸업작품 중개 서비스 프로젝트_NES

Django 데코레이터 설정

김디니 2022. 12. 26. 21:32

졸업작품 중개 서비스로써 회원들은 작가 혹은 일반 회원(구매자)로 나눠져 있다. 

작가들을 위한 페이지/기능(작품 등록, 작품 수정, 작품 삭제, 구매자의 작품 가격 제안 수락)이 있는데,

이를 위해 작가 데코레이터가 필요하였다. 

 

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와 같은 로직으로 사용)

 

출처

https://blog.naver.com/PostView.naver?blogId=pjok1122&logNo=221609714268&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 

 

[Python / Django] Decorator(데코레이터) 사용하기

1. Decorator란? 함수를 Wrapping 하는 기법으로 반복되는 코드를 줄일 수 있다는 장점이 있습니다. 물론...

blog.naver.com

 

더 자세하게 말해보자면 *args는 여러 개의 인자를 함수로 받고자 할 때 사용된다. 

여러 개의 인자를 받을 때에는 튜플 형식으로 받는다.

즉, 함수로 받고자 하는 인자가 정확히 몇개인지 모를 때 사용한다. (이를 '가변인자'라고 한다.)

여기서 args는 arguments의 약자이다.

 

**kwargs는 keyword arguments의 약자로,

딕셔너리 형태인 {'키워드': '특정 값'}으로 함수 내부로 전달된다고 한다. 

 

*args와 **kwargs를 같이 쓸 때 키-값 형태의 인자를 주면 파이썬은 자동으로 kwargs에 저장해준다고 한다. 

결국 *args와 **kwargs는 모두 가변인자를 받기 위해 사용되는 것이다. 

 

출처:https://legitcode267.tistory.com/13

출처: https://blog.naver.com/PostView.naver?blogId=pjok1122&logNo=221609714268&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView 

 

 

 

다시 본론으로 돌아와 함수를 정의한다.

        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 에서 직접 만들어준 데코레이터를 사용하여 유저 권한을 부여하도록 한다.