Flask에서 데코레이터는 기능을 추가하거나 변경하는 데 사용되는 파이썬의 기능입니다.
주로 뷰 함수를 감싸고, 특정한 기능을 수행하도록 하는 데 사용됩니다.
Flask는 기본적으로 아래의 표와 같이 데코레이터를 제공합니다.
Decorator | Description |
---|---|
before_first_request | flask 실행 후 가장 첫번째 요청에 대해 실행 |
before_request | 요청이 있을 때마다 실행 |
after_request | 요청에 대한 처리가 끝난 후 클라이언트에 응답 전 실행 |
teardown_request | 요청에 대한 처리가 끝난 후 클라이언트에 응답 후 실행 |
template_filter() | 템플릿에서 호출 시 실행 |
errorhandler() | 서버의 응답 코드에 대해 실행 |
이전 글에서 Flaks-Login을 이용한 로그인 예제를 하였었습니다.
이번에는 사용자 정의 데코레이터
를 이용한 역할 기반의 접근 통제를 구현해봅니다.
💡 본 글은 예제 코드를 이용하여 설명합니다.
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)를 반환해줍니다.
flask/source/my_app/views/dashboard.py를 살펴봅니다.
본 예제에서는 사용자의 역할을 검사하는 데코레이터(role_required)를 정의하였었습니다.
데코레이터를 사용할 때는 함수의 위에 골뱅이(@)와 함수를 호출하면 됩니다.
이 데코레이터는 허용할 역할을 리스트 형 데이터로 입력받습니다.
@role_required(["ADMIN"])