이번에는 flask_request_validator
라는 패키지로 플라스크에서 파라미터 유효성 검사를 하는 법을 알아보겠습니다.
이런 패키지가 있는지 알아보게 된 이유는, 현재 브랜디 셀러 어드민 클론 프로젝트를 하면서 많은 양의 파라미터를 URL parameter
와 request.body
에 담아서 보내야했기 때문인데요, 각각의 값들이 request
로 들어올 때 빠진 값은 없는지, 유효성은 충족하고 있는지를 모두 확인해야했습니다.
(많고 많은 파라미터들)
각각을 모두 확인해서 에러처리하는 과정을 거치기에는 좀 더 좋은 방법이 있지 않을까 생각했고, 찾아보니 다행히 flask_request_validator
라는 패키지가 존재했습니다.
패키지는 4가지의 request parameter
타입을 다뤄줍니다.
그리고 아래의 유효성 방식을 제공합니다.
값의 타입은 str, bool, int, float, dict, list
를 지원합니다.
파라미터의 유효성을 제시하는 방식은 아래와 같이 진행합니다. required
를 이용해서 필수 값인지 확인할 수도 있고, default
를 통해 디폴트 값을 지정할 수도 있습니다.
Param(
param_name_in_request, # str
request_param_type, # where stored param(GET, FORM, JSON, PATH)
type_of_value, # str, bool, int, float, dict, list - which type we want to have
required_or_no, bool - True by default
default_value, None by default. You can use lambda for this arg - default=lambda: ['test']
list_of_rules
)
실제로 아래와 같이 활용했습니다. path를 지정하는 데코레이터를 최상단에 두고, 로그인 데코레이터와 파라미터 데코레이터를 실행하려는 함수 위에 위치시켰습니다.
이때 하나 주의해야할 점은 루트 데코레이터 밑에 여러 데코레이터가 쌓이면서 duplicate view
관련 에러가 뜨는데, 이 에러는 루트 데코레이터의 인자에 endpoint
를 넣고 실행할 함수명을 지정하면 해결할 수 있습니다.
@seller_app.route('/<int:parameter_account_no>', methods=['PUT'], endpoint='change_password')
@login_required
@validate_params(
Param('parameter_account_no', PATH, int),
Param('original_password', JSON, str, required=False),
Param('new_password', JSON, str),
)
def change_password(*args):
pass
파라미터 유효성 검사를 통과한 파라미터들은 파라미터 값들만 튜플에 담겨서 리턴되고, 사용할 함수에서 *args
로 받아 사용하면 됩니다.
저 같은 경우는 아래와 같이 딕셔너리를 새로 만들어 값을 지정해줬습니다.
# validation 확인이 된 data 를 account_info 로 재정의
account_info = {
'parameter_account_no': args[0],
'original_password': args[1],
'new_password': args[2]
}
파라미터가 유효성 검사를 통과하지 못하면, {'brandi_app_user_app_id': ['Value is required']}
와 같이 어떤 파라미터가 정해진 조건을 통과하지 못했는지 알려줍니다. 이 메시지는 디폴트로 터미널에 표출되게 되어있는데, 전 모듈을 수정해서 리턴 에러메시지에 담아서 사용했습니다.
더 자세한 사용 방법은 도큐먼트를 확인해보세요!