[python] Flask-RESTful에서 데이터 검증을 위한 방법

Flask-RESTful은 Flask 기반의 RESTful API를 쉽게 개발할 수 있게 해주는 파이썬 라이브러리입니다. 이 라이브러리를 사용하여 API를 개발할 때, 종종 클라이언트로부터 전달된 데이터의 유효성을 검사해야 할 때가 있습니다. 이번 포스트에서는 Flask-RESTful에서 데이터를 검증하는 방법에 대해 알아보겠습니다.

1. Flask-RESTful 요청 파싱

Flask-RESTful에서는 클라이언트로부터 전달된 데이터를 파싱하는 기능을 제공합니다. reqparse 모듈을 사용하여 요청 파라미터를 정의하고, 해당 파라미터에 대한 유효성 검사를 수행할 수 있습니다.

아래의 예제 코드에서는 reqparse 모듈을 사용하여 name이라는 파라미터를 정의하고, 해당 파라미터에 대한 유효성 검사를 수행합니다.

from flask_restful import Resource, reqparse

class MyResource(Resource):
    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('name', type=str, required=True, help='name field is required')

    def post(self):
        args = self.parser.parse_args()
        # args['name']에 클라이언트로부터 전달된 name 값이 저장됨
        # 데이터 검증 및 처리 로직 작성
        return {'message': f'Hello, {args["name"]}!'}

위 코드에서 self.parser.add_argument() 메서드를 사용하여 name 파라미터를 정의하고, 해당 파라미터의 유형을 str로 지정하고 필수 파라미터로 설정했습니다. 만약 name 파라미터가 전달되지 않으면 클라이언트에게 에러 메시지가 반환됩니다.

2. 사용자 정의 검증기

Flask-RESTful에서는 사용자가 직접 유효성 검사를 정의할 수도 있습니다. reqparse 모듈을 사용하여 파라미터에 대한 검증 함수를 지정할 수 있습니다.

아래의 예제 코드에서는 age라는 파라미터에 대한 검증 함수를 정의하고, 해당 함수에서는 age 값이 0보다 큰지를 검사합니다.

from flask_restful import Resource, reqparse

def age_validator(value):
    if value <= 0:
        raise ValueError('Age must be greater than 0')

class MyResource(Resource):
    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('age', type=int, required=True, help='age field is required', location='json', 
                                 validate=age_validator)

    def post(self):
        args = self.parser.parse_args()
        # args['age']에 클라이언트로부터 전달된 age 값이 저장됨
        # 데이터 검증 및 처리 로직 작성
        return {'message': f'Your age is {args["age"]}!'}

위 코드에서 self.parser.add_argument() 메서드의 validate 인자를 사용하여 파라미터에 대한 검증 함수를 지정하였습니다. 만약 age 값이 0보다 작거나 같으면 클라이언트에게 에러 메시지가 반환됩니다.

3. 데이터 검증 오류 처리

Flask-RESTful에서는 데이터 검증을 수행하는 도중 발생한 오류를 처리하기 위해 abort 함수를 사용할 수 있습니다. abort 함수를 사용하여 오류 발생 시 적절한 HTTP 상태 코드와 함께 에러 메시지를 반환할 수 있습니다.

아래의 예제 코드에서는 name 파라미터의 값이 비어 있는지를 검사하여 오류가 발생하면 400(Bad Request) 상태 코드와 함께 에러 메시지를 반환합니다.

from flask_restful import Resource, reqparse, abort

class MyResource(Resource):
    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('name', type=str, required=True, help='name field is required')

    def post(self):
        args = self.parser.parse_args()
        
        if not args['name']:
            abort(400, message='Name cannot be empty')
        
        # 데이터 검증 및 처리 로직 작성
        return {'message': f'Hello, {args["name"]}!'}

위 코드에서 abort(400, message='Name cannot be empty')을 사용하여 400 상태 코드와 함께 Name cannot be empty라는 메시지를 반환합니다.

결론

이번 포스트에서는 Flask-RESTful에서 데이터를 검증하는 방법에 대해 알아보았습니다. reqparse 모듈을 사용하여 파라미터를 정의하고, 사용자 정의 검증기를 작성하여 데이터의 유효성을 검증하고, abort 함수를 사용하여 오류 처리를 할 수 있습니다. 데이터의 검증은 안전한 API 개발에 있어 중요한 부분이므로 신중하게 처리해야 합니다.


참고문서: