python-flask에서 패키지로 파라미터 유효성검사 하기

devmin·2020년 4월 5일
2

이번에는 flask_request_validator라는 패키지로 플라스크에서 파라미터 유효성 검사를 하는 법을 알아보겠습니다.

이런 패키지가 있는지 알아보게 된 이유는, 현재 브랜디 셀러 어드민 클론 프로젝트를 하면서 많은 양의 파라미터를 URL parameterrequest.body에 담아서 보내야했기 때문인데요, 각각의 값들이 request로 들어올 때 빠진 값은 없는지, 유효성은 충족하고 있는지를 모두 확인해야했습니다.
(많고 많은 파라미터들)

각각을 모두 확인해서 에러처리하는 과정을 거치기에는 좀 더 좋은 방법이 있지 않을까 생각했고, 찾아보니 다행히 flask_request_validator라는 패키지가 존재했습니다.


패키지는 4가지의 request parameter 타입을 다뤄줍니다.

  • GET - parameter stored in flask.request.args(쿼리 파라미터에 담긴 값)
  • FORM - parameter stored in flask.request.form(폼 형태로 들어온 값)
  • JSON - parameter stored in flask.request.get_json()(request.body로 들어온 json 값)
  • PATH - parameter stored in flask.request.view_args. In this case is part of route(route 파라미터)

그리고 아래의 유효성 방식을 제공합니다.

  • Pattern(r'^[a-z-_.]{8,10}$') - 정규식 형태, str에만 사용 가능
  • MaxLength(6) - 최대 길이 체크, str과 list에서만 사용 가능
  • MixLength(6) - 최소 길이 체크, str과 list에서만 사용 가능
  • Enum('value1', 'value2') - 허용된 값 제시
  • AbstractRule - 커스텀 룰 사용 가능

값의 타입은 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']} 와 같이 어떤 파라미터가 정해진 조건을 통과하지 못했는지 알려줍니다. 이 메시지는 디폴트로 터미널에 표출되게 되어있는데, 전 모듈을 수정해서 리턴 에러메시지에 담아서 사용했습니다.

더 자세한 사용 방법은 도큐먼트를 확인해보세요!

profile
개발자가 되어가는 중

0개의 댓글