[電源を入れる] Pythonのスキーマエレガントな認証データ

転送  https://segmentfault.com/a/1190000011777230

スキーマは何ですか?

決して信頼ユーザーの入力データ-どんなに私たちが適用されないものを、限り、ユーザーの入力として扱うと、原則としてありません。私たちは、ユーザー入力の厳格な検証、一般的な入力データをJSON形式のWeb開発バックエンドAPIに送信され、入力データの検証を行うためのAPIなければならないことを意味します。私は通常の判断、さまざまの多くを追加しif、コードを結果することは非常に醜いです、ユーザーデータにそれを検証するよりエレガントな方法はありませんか?Schemaこれは便利です。

Schema非常に単純な、それはコードの数百行だ、それはコアクラスですSchema

1. Schema类着信タイプintstrfloat等)

例えば:

from schema import Schema

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

可視Schema行く検証validateオブジェクト型に渡された方法は、それ以外の場合はスロー、返された入力データがあり、指定されていないSchemaError例外(サブクラス)。SchemaUnexpectedTypeErrorSchemaError

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また、クラス(数組み込みUseAndOr、など)と、これらのクラスの例であるvalidate方法として使用することができるSchema、例えば、引数:

from schema import Schema, And

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

4へのSchema类コンテナオブジェクトを渡すlisttupleset等)

例えば:


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.よくある質問

  1. 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'}
  1. 私が欲しいSchema辞書に検証データの一部だけを、あなたは余分を持つことができますkeyが、Baocuoは、どのようにしないのですか?
Schema({'name': str, 'age': int}, ignore_extra_keys=True).validate({'name': 'foobar', 'age': 100, 'sex': 'male'}) {'age': 100, 'name': 'foobar'}
  1. Schemaスローされた例外情報は非常に友好的ではない、と私はエラーメッセージをカスタマイズしたい、どのようにしますか?

SchemaビルトインクラスUseAndOrRegex、、Schemaなど)パラメータを有しているerror、エラーメッセージをカスタマイズすることができ

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

おすすめ

転載: www.cnblogs.com/yoyo008/p/11532416.html