каталог
- инструкции Python схемы
- 1. афферентных типов Schema (междунар, ул, поплавок и т.д.)
- 2. Схема к классу входящего объекта (функция с __call__ и т.д.) можно назвать
- 3. Класс схемы для проверки входящего объекта с помощью метода
- 4. Схема афферентных для контейнера объектов (список, кортеж, набор, и т.д.)
- 5. Схема для передачи в словаре объекта (большинство сцен передаются с помощью объекта словаря схемы, это очень важно)
- 6. Вопросы и ответы
- 6.1 Схема словаря Incoming очень удобно, но некоторые из моих данных не является обязательными, что некоторые ключи не могут обеспечить, как это сделать?
- 6.2 Запрещается ввод ключа: Запрещено
- Я хочу только 6.3 Схема проверки части входящего словаря данных, вы можете иметь дополнительный ключ, но не Baocuo, как делать?
- 6.4 Схема информации выброшенного исключения не очень дружелюбно, и я хочу, чтобы настроить сообщения об ошибках, как это сделать?
- 6.5 Использование
- 6,6 Const
- 7. Более сложный пример:
инструкции Python схемы
Проект Адрес: GitHub
1. Схема Что это?
Независимо от того, что мы делаем применить, если пользовательский ввод и дело, не существует принцип - никогда не доверяет ввод пользовательских данных. Означает, что мы должны быть строгими проверки пользовательского ввода, общий ввод данных отправляется на веб-разработки бэкэнд API в JSON форме, API сделать проверку входных данных. Я обычно добавляю много суждений, все виды, если, в результате чего в коде очень некрасиво, не может есть более элегантный способ проверки пользовательских данных это? Схема пригождается.
Схема очень проста, это несколько сотен строк кода, это основной класс: Schema.
2. Установить
pip install schema
1. афферентных типов Schema (междунар, ул, поплавок и т.д.)
Например:
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: 字符串已经存在
Схема метод проверки будет видно значение, переданное в соответствующей функции внутри передаются в качестве параметров, функция возвращает значение Истина, если входные данные возвращаются, в противном случае возникает исключение.
3. Класс схемы для проверки входящего объекта с помощью метода
Схема также построен ряд классов (использование, и, или и т.д.), являются примерами этих классов с методом валидации также передается в качестве параметра схемы, например:
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 Схема словаря Incoming очень удобно, но некоторые из моих данных не является обязательными, что некоторые ключи не могут обеспечить, как это сделать?
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 Схема информации выброшенного исключения не очень дружелюбно, и я хочу, чтобы настроить сообщения об ошибках, как это сделать?
Схема собственного класс (использование, И, ИЛИ, Regex, схема и т.д.) имеет ошибку параметра, сообщение об ошибке может быть изменено
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 Const
Мы знаем, что во время проверки использования, автоматически поможет вам преобразовать его значение. Const быть оставляя оригинал без:
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