간단한 파이썬 스키마


파이썬 스키마 지침

프로젝트 주소 : GitHub의

1. 스키마가 무엇입니까?

결코 신뢰 사용자가 입력 한 데이터 - 아무리 우리가 적용 할 것을, 한 사용자 입력으로하고 다루는 원칙이 없다. 우리는 사용자 입력의 엄격한 검증, 일반적인 입력 데이터가 JSON 형태로 웹 개발 백엔드 API로 전송, 입력 데이터의 유효성 검사를 할 수있는 API가 될 필요가 있다는 것을 의미한다. 나는 보통 사용자가 아닌 데이터를 검증하는 더 우아한 방법이 할 수있는, 코드에서 발생하는 매우 추한 경우 모든 종류의 판단을 많이 추가? 스키마 유용합니다.

스키마는 그것이 핵심 클래스, 코드의 몇 백 개 라인있어, 매우 간단합니다 : 스키마.

2. 설치

pip install schema

스키마 유형 (INT, STR, 플로트 등) 1. 구 심성

예를 들면 :

from schema import Schema

Schema(int).validate(10)
# 10
Schema(int).validate('10')
# SchemaUnexpectedTypeError: '10' should be instance of 'int'

스키마 검증이 개체 유형에 전달되는 방법을 지정하지 유효성을 검사 보일 것이다, 그렇지 않은 경우의 SchemaError (SchemaUnexpectedTypeError이 SchemaError의 서브 클래스) 발생 반환되는 입력 데이터입니다.

입력 객체 클래스 2. 스키마 (__call__ 등으로 기능)을 호출 할 수있다

예를 들면 :

Schema(lambda x: 0<x<10).validate(5)
# 5
Schema(lambda x: 0<x<10).validate(57)
# SchemaError: <lambda>(57) should evaluate to True

사용자 정의 기능 :

def secre_validate(password):
    password_list = ["123456", "666666", "888888", "abcdef", "aaaaaa", "112233"]
    if password in password_list:
        return False
    return True

Schema(secre_validate,  error="字符串已经存在").validate("123456")

# schema.SchemaError: 字符串已经存在

매개 변수로 전달 내부 스키마 검증 방법은, 그렇지 않은 경우 예외가 발생되어, 입력 데이터가 반환되는 경우 기능 True 값을 반환 해당 함수에 전달 된 값을 알 수있을 것이다.

3. 스키마 클래스는 방법 들어오는 객체의 유효성을 검사

스키마는 또한 클래스의 수 (사용, AND, OR 등), 또한 예를 들어, 스키마의 매개 변수로 전달 validate 메소드와이 클래스의 예를 구축 :

from schema import Schema, And

# And代表两个条件必须同时满足
Schema(And(str, lambda s: len(s) > 2)).validate('abcd')
# 'abcd'

컨테이너 객체 4. 스키마 심성 (목록 튜플 설정 등)

예를 들면 :

Schema([int, float]).validate([1, 2, 3, 4.0])
# [1, 2, 3, 4.0]

이 [1, 2, 3, 4.0] INT이거나 작업 (또는 음의 관계)를 부유해야하는 요소에 대해, 대응

5. 스키마가 사전 객체에 전달하는 (장면의 대부분의 스키마 사전 개체를 사용하여 전달되며, 이것은 매우 중요합니다)

Schema({'name': str, 'age': int}).validate({'name': 'foobar', 'age': 18})
# {'age': 18, 'name': 'foobar'}
Schema({'name': str, 'age': int}).validate({'name': 'foobar'})
# SchemaMissingKeyError: Missing keys: 'age'

우선, 모드 사전이라는 명확한 두 개념 스키마 들어오는 클래스 사전은 사전 데이터 사전 전화 수신 방법을 valdiate.

첫째, 스키마 패턴 사전 및 데이터 사전의 키가 정확히 같은, 아니 같은 일이 직접적으로 발생 여부를 확인할 수 있습니다. 당신이 해당 값 모드 사전의 가치를 확인하기 위해 데이터 사전을 얻기 위해 원하는 경우에만 데이터 사전 값은 그것을 통해 확인 할 수있다, 그렇지 않으면, 모든 데이터를 반환 예외, 그것의 갑작스러운 느낌 신선한 검증 느낌되지 않습니다 던져?

6. 자주 묻는 질문

6.1 스키마 들어오는 사전은 매우 편리하지만, 내 데이터 중 일부는 어떤 키를 수행하는 방법을 제공하지 않을 수 있음을, 선택 사항입니다?

from schema import Optional, Schema


Schema({'name': str, Optional('age'): int}).validate({'name': 'foobar'})
# {'name': 'foobar'}
Schema({'name': str, Optional('age', default=18): int}).validate({'name': 'foobar'})
# {'age': 18, 'name': 'foobar'}

6.2 키 입력 금지 : 금지됨

금지 핵심이 금지 될 수 있습니다 :

from schema import Schema, Forbidden

Schema({Forbidden('name'): str, 'age': int}).validate({"age": 15})                            # {"age": 15}
Schema({Forbidden('name'): str, 'age': int}).validate({"name": "laozhang", "age": 15})        # schema.SchemaForbiddenKeyError
Schema({Forbidden('name'): str, 'age': int}).validate({"name": 10, "age": 15})                # schema.SchemaWrongKeyError

거부할지 여부를 결정합니다 사용할 비밀 키 값 쌍 것을 주목할 필요가있다 :

from schema import Schema, Forbidden

Schema({Forbidden('name'): int, 'name': str}).validate({'name': 'laozhang'})                  # {'name': 'laozhang'}
Schema({Forbidden('name'): str, 'name': str}).validate({'name': 'laozhang'})                  # schema.SchemaForbiddenKeyError

또한, 옵션보다 더 높은 우선 순위를 금지 :

from schema import Schema, Forbidden, Optional

Schema({Forbidden('name'): str, Optional('name'): str}).validate({"name": "laozhang"})        # schema.SchemaForb

내가 들어오는 데이터 사전의 6.3 스키마 검증 부분을 원하는, 당신은 여분의 열쇠를 가질 수 있지만 Baocuo는 어떻게해야하지?

Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'})
# {'age': 100, 'name': 'foobar'}

6.4 스키마 발생한 예외 정보가 매우 친절하지 않다, 나는 오류 메시지를 사용자 정의 할, 어떻게 할까?

스키마 자신의 클래스 (사용, 그리고, 또는, 정규식, 스키마 등) 오류 메시지가 사용자 정의 할 수 있습니다, 매개 변수 오류가 있습니다

Schema({'name': str, 'age': Use(int, error='年龄必须是整数')}).validate({'name': 'foobar', 'age': 'abc'})
# SchemaError: 年龄必须是整数

6.5 사용

검증시 사용, 그것은 자동으로 그 값을 변환하는 데 도움이됩니다

from schema import Schema, Use

print Schema(Use(int)).validate(10)                 # 10-->int类型
print Schema(Use(int)).validate('10')               # 10-->int类型
print Schema(Use(int)).validate('xiaoming')         # schema.SchemaError

6.6 헌장

우리는 사용의 검증시, 자동으로 그 값을 변환 할 것이라는 점을 알고있다. 헌장은 원본 그대로를 떠날 수 :

from schema import Schema, Use, Const

print Schema(Const(Use(int))).validate('10')        # 10-->str类型

7.보다 복잡한 예 :

from schema import Schema, And, Optional, SchemaError, Regex


def name_check(name):
    password_list = ["root", "admin", "888888", "baba", "aaaaaa", "112233"]
    if name in password_list:
        return False
    return True


schema = {
    "id": And(int, lambda x: 100 <= x, error="id必须是整数,大于等于100"),
    "name": And(str, name_check, error="name已经存在"),
    "price": And(float, lambda x: 111 > x > 0, error="price必须是大于0小于111的小数"),
    "data": {
        "password": And(Regex("[a-z0-9A-Z]{8,20}"), error="密码为数字、字母,长度8-20"),
        "email": And(Regex("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"), error="email格式错误")
    },
    Optional("info", default="这个key可以不提供,我设置了这一段默认值。"): str,
}

data = {
    "id": 111,
    "name": "jarvis",
    "price": 9.5,
    "data": {
        "password": "222agfwetAAA",
        "email": "[email protected]",
    }
}

try:
    a = Schema(schema).validate(data)
except SchemaError as e:
    print(e)
else:
    print("验证成功!\n{}".format(a))


# 验证成功!
# {'id': 111, 'name': 'jarvis', 'price': 9.5, 'data': {'password': '222agfwetAAA', 'email': '[email protected]'}, 'info': '这个key可以不提供,我设置了这一段默认值。'}

참고 기사 : HTTPS : //segmentfault.com/a/1190000011777230#articleHeader5

추천

출처www.cnblogs.com/ChangAn223/p/11239537.html