Python 데이터 역직렬화하고 유효성 검사하는 Colander 라이브러리 알아보기

오늘은 Python으로 데이터를 직렬화하고 데이터의 유효성을 검증할 수 있는 Colander 패키지에 대하여 알아보려 합니다.

Colander 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip3 install --upgrade pip

pip의 업그레이드가 존재하는지 확인하고 진행합니다.

pip install colander

pip로 colander를 설치합니다.

실습

import colander

colander를 가져옵니다.

class Place(colander.MappingSchema):
    location = colander.SchemaNode(colander.String(),
                                   validator=colander.OneOf(['home', 'work']))
    Latitude_longitude = colander.SchemaNode(colander.String())

두 필드를 가진 Place라는 MappingSchema 클래스를 만듭니다.

location은 문자열이며 home이나 work중에 하나이어야 합니다.

Latitude_longitude는 문자열이어야 합니다.

class GPS(colander.SequenceSchema):
    place = Place()

Place 객체를 할당하여 SequenceSchema인 GPS 클래스를 만듭니다.

class Information(colander.MappingSchema):
    id = colander.SchemaNode(colander.String())
    login = colander.SchemaNode(colander.Int(), validator=colander.Range(0, 999))
    gps = GPS()

Information이라는 MappingSchema 클래스를 만듭니다.

해당 클래스는 id, login 필드와 SequenceSchema인 gps 필드로 구성되어 있습니다.

my_information = {
    'id': 'example@example.com',
    'login': '1',
    'gps': [{'location': 'home', 'Latitude_longitude': '37.576108, 126.976838'},
            {'location': 'work', 'Latitude_longitude': '37.400527, 127.104773'}],
}

이제 유효성을 검사할 데이터 셋을 가져옵니다.

schema = Information()

Information 객체를 스키마로 설정합니다.

try:
    deserialized = schema.deserialize(my_information)
except colander.Invalid as e:
    print(e)

스키마를 역직렬화하여 객체를 만들어봅니다.

이 때에 데이터가 유효하지 않다면 except에 의해 출력됩니다.

serialized = schema.serialize(my_information)
print(serialized)

다시 직렬화하여 출력합니다.

imperative mode

import colander

기존 클래스로 구성하는 것처럼 colander를 가져옵니다.

schema = colander.SchemaNode(colander.Mapping())
schema.add(colander.SchemaNode(colander.String(), name='id'))
schema.add(colander.SchemaNode(colander.Int(), name='login',
                               validator=colander.Range(0, 999)))

스키마를 선언하듯이 구성할 수 있습니다.

각자의 SchemaNode를 추가하여 완성합니다.

my_information = {
    'id': 'example@example.com',
    'login': '1',
}

유효성을 검사할 데이터 셋을 가져옵니다.

try:
    deserialized = schema.deserialize(my_information)
except colander.Invalid as e:
    print(e)

스키마를 역직렬화하여 객체를 만들어봅니다.

이 때에 데이터가 유효하지 않다면 except에 의해 출력됩니다.

serialized = schema.serialize(my_information)
print(serialized)

다시 직렬화하여 출력합니다.

Written on April 21, 2019