장고로 쇼핑몰 만들기 (로그인 데코레이터)

팔리동·2021년 4월 16일
0

데코레이터

  • 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용한다.
  • 자세한 개념은 파이썬 심화의 데코레이터를 참조하자(물론 아직 안배웠지만)

decorators.py

from django.shortcuts import redirect
from .models import Fcuser

def login_required(function):
    def wrap(request, *args, **kwargs):
        user = request.session.get('user')
        if user is None or not user:
            print('login required')
            return redirect('/login')
        return function(request, *args, **kwargs)
    return wrap 

def admin_required(function):
    def wrap(request, *args, **kwargs):
        user = request.session.get('user')
        if user is None or not user:
            return redirect('/login')

        user = Fcuser.objects.get(email=user)
        if user.level != 'admin':
            print(user)
            return redirect('/')

        return function(request, *args, **kwargs)
    return wrap 
  • 로그인을 하지 않으면 로그인 페이지로 redirect시키는 함수이다.

  • 중간 중간 프린트문은 내가 확인하기 위해 집어넣었다. view함수에 프린트문을 넣으면 중간중간 변수안에 어떤 객체가 들어있는지 확인 할 수 있다. 이걸 이제서야 알게 되다니 너무 기쁘다.

  • if user.level != 'admin':데이터 모델을 수정해서 level이라는 field를 넣어서 유저의 등급을 분류했다. 등급에따라 페이지에 접근을 제한하는 로직이다.

  • def wrap(request, *args, **kwargs): 인자를 이렇게 많이 받는 이유는 wrap한 함수이기 때문에 인자값을 맞춰주기 위해서다?
    -데코레이터 개념 더 알고 수정하기-

views(데코레이터 이용 예)

from django.utils.decorators import method_decorator
from fcuser.decorators import admin_required

@method_decorator(admin_required, name='dispatch')
class ProductCreate(FormView):
    template_name = 'register_product.html'
    form_class = RegisterForm
    success_url = '/product/' 
  • @method_decorator는 클래스에 데코레이터를 붙일 때 사용한다.
    따로 임포트 해와서 써야한다.
  • @method_decorator에 인자는 데코레이터로 쓸 함수 이름이다.
    (admin_required, name='dispatch')
    name=dispatch는 클래스에 데코레이터 붙일 때 사용한다.
profile
배움의 기록

0개의 댓글