転送 https://segmentfault.com/a/1190000011777230
スキーマは何ですか?
決して信頼ユーザーの入力データ-どんなに私たちが適用されないものを、限り、ユーザーの入力として扱うと、原則としてありません。私たちは、ユーザー入力の厳格な検証、一般的な入力データをJSON形式のWeb開発バックエンド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: 0<x<10).validate(5)
5 Schema(lambda x: 0<x<10).validate(57) SchemaError: <lambda>(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.よくある質問
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
が、Baocuoは、どのようにしないのですか?
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: 年龄必须是整数