[Flask] Decorator

Alexandria·2023년 11월 17일
0

Python3 Flask

목록 보기
8/14
post-thumbnail

1. 데코레이터

Flask에서 데코레이터는 기능을 추가하거나 변경하는 데 사용되는 파이썬의 기능입니다.

주로 뷰 함수를 감싸고, 특정한 기능을 수행하도록 하는 데 사용됩니다.

Flask는 기본적으로 아래의 표와 같이 데코레이터를 제공합니다.

DecoratorDescription
before_first_requestflask 실행 후 가장 첫번째 요청에 대해 실행
before_request요청이 있을 때마다 실행
after_request요청에 대한 처리가 끝난 후 클라이언트에 응답 전 실행
teardown_request요청에 대한 처리가 끝난 후 클라이언트에 응답 후 실행
template_filter()템플릿에서 호출 시 실행
errorhandler()서버의 응답 코드에 대해 실행

이전 글에서 Flaks-Login을 이용한 로그인 예제를 하였었습니다.

이번에는 사용자 정의 데코레이터를 이용한 역할 기반의 접근 통제를 구현해봅니다.

💡 본 글은 예제 코드를 이용하여 설명합니다.

1.1. 사용자 정의

flask/source/my_app/models/role.py를 살펴봅니다.

이 함수는 사용자의 역할이 적절한지 검사하는 함수이며, 데코레이터로 활용할 것입니다.

Flask에서 데코레이터를 정의하고 싶다면 함수 명, 입력 값과 decorated_function의 내용만 변경하면 됩니다.

def role_required(roles:list):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            user_roles = [role.name for role in current_user.roles]
            for role in roles:
                if role in user_roles:
                    return f(*args, **kwargs)
            return abort(code=403)
        return decorated_function
    return decorator

예제와 같이 필터링 등 검사를 위한 데코레이터이면 검사가 성공 시 f(*args, **kwargs)를 반환해줍니다.

1.2. 사용

flask/source/my_app/views/dashboard.py를 살펴봅니다.

본 예제에서는 사용자의 역할을 검사하는 데코레이터(role_required)를 정의하였었습니다.

데코레이터를 사용할 때는 함수의 위에 골뱅이(@)와 함수를 호출하면 됩니다.

이 데코레이터는 허용할 역할을 리스트 형 데이터로 입력받습니다.

@role_required(["ADMIN"])
profile
IT 도서관

0개의 댓글