您的当前位置:首页正文

Python通过Schema实现数据验证方式

2024-04-16 来源:汇智旅游网
Python通过Schema实现数据验证⽅式

Schema是什么?

不管我们做什么应⽤,只要和⽤户输⼊打交道,就有⼀个原则--永远不要相信⽤户的输⼊数据。意味着我们要对⽤户输⼊进⾏严格的验证,web开发时⼀般输⼊数据都以JSON形式发送到后端API,API要对输⼊数据做验证。⼀般我都是加很多判断,各种if,导致代码很丑陋,能不能有⼀种⽅式⽐较优雅的验证⽤户数据呢?Schema就派上⽤场了。Schema⾮常简单,也就⼏百⾏的代码,最核⼼的类就⼀个:Schema。1. 给Schema类传⼊类型(int、str、float等)例如:

from schema import Schema

Schema(int).validate(10)10

Schema(int).validate('10')

SchemaUnexpectedTypeError: '10' should be instance of 'int'

可见Schema会去验证validate⽅法传⼊的对象是不是所指定的类型,是则返回传⼊的数据,否则抛出⼀个SchemaError的异常(SchemaUnexpectedTypeError是SchemaError的⼦类)。2. 给Schema类传⼊可调⽤的对象(函数、带__call__的类等)例如:

Schema(lambda x: 0Schema(lambda x: 0SchemaError: (57) should evaluate to True

可见Schema会把validate⽅法传⼊的值传⼊到对应的函数⾥⾯作为参数,如果函数返回值为True则返回输⼊数据,否则抛出异常。

3. 给Schema类传⼊带有validate⽅法的对象

Schema也内置了⼀些类(Use、And、Or等等),这些类的实例都带有validate⽅法,亦可作为Schema的参数传⼊,例如:

from schema import Schema, And

# And代表两个条件必须同时满⾜

Schema(And(str, lambda s: len(s) > 2)).validate('abcd')'abcd'

4. 给Schema类传⼊容器对象(list、tuple、set等)例如:

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

相当于,对于[1, 2, 3, 4.0]当中的任何⼀个元素,必须是int或者float才⾏(注意是or的关系)5. 给Schema传⼊⼀个字典对象(⼤部分使⽤Schema的场景都是传⼊字典对象,这个很重要)

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'

⾸先,明确两个概念,Schema类传⼊的字典,称之为模式字典,valdiate⽅法传⼊的字典称之为数据字典。

⾸先,Schema会判断, 模式字典和数据字典的key是否完全⼀样,不⼀样的话直接抛出异常。如果⼀样,就去拿数据字典的value去验证模式字典相应的value,如果数据字典的全部value都可以验证通过的话才返回数据,否则抛出异常,是不是感觉

这种验证顿时感觉清爽了呢?6. faqs

Schema传⼊字典很好⽤,但是我有的数据是可选的,也就是说有的key可以不提供怎么办?

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'}

我想让Schema只验证传⼊字典中的⼀部分数据,可以有多余的key但是不要抱错,怎么做?

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

Schema抛出的异常信息不是很友好,我想⾃定义错误信息,怎么办?

Schema⾃带的类(Use、And、Or、Regex、Schema等)都有⼀个参数error,可以⾃定义错误信息

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

SchemaError: 年龄必须是整数

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容