データ検証

データ検証は箱を開けてすぐに使用する.あなたの構成には、API管理の各リソースのアーキテクチャ定義が含まれています。挿入/更新するAPIに送信されたデータはアーキテクチャに従って検証され,検証が通過した場合にのみリソースが更新される.

$ curl -d '[{"firstname": "bill", "lastname": "clinton"}, {"firstname": "mitt", "lastname": "romney"}]' -H 'Content-Type: application/json' http://myapi/people
HTTP/1.1 201 OK

応答は、要求内に提供される各項目の成功/エラー状態を含む:

{
    "_status": "ERR",
    "_error": "Some documents contains errors",
    "_items": [
        {
            "_status": "ERR",
            "_issues": {"lastname": "value 'clinton' not unique"}
        },
        {
            "_status": "OK",
        }
    ]
]

上記の例では、第1の文書は検証されていないため、要求全体が拒否される。

すべての文書が検証されて正しく挿入された場合,応答状態は 201 Created それがそうです。いずれの文書も検証されていない場合、応答状態は 422 Unprocessable Entity 定義された他のエラーコードでも VALIDATION_ERROR_STATUS 配置します。

文書アーキテクチャおよび標準検証ルールをどのように定義するかに関する情報は、参照されたい 構造定義 それがそうです。

拡張データ検証

データ検証は Cerberus 検証システムは,したがって拡張可能である.実際,EveのMongoDBデータ層自体にCerberus検証を拡張し,実現した. unique そして data_relation 制約、すなわち ObjectId データタイプと decimal128 標準規則の上にある。

検証ルールをカスタマイズする.

あなたの特定かつ非常に特殊な用例では,ある値は奇数でしか表現できないと仮定する.新しいのを追加することにしました isodd 規則は私たちの検証案に追加される。以下は、この機能をどのように実施するかです。

from eve.io.mongo import Validator

class MyValidator(Validator):
    def _validate_isodd(self, isodd, field, value):
        if isodd and not bool(value & 1):
            self._error(field, "Value must be an odd number")

app = Eve(validator=MyValidator)

if __name__ == '__main__':
    app.run()

Mongoベリファイアベースのサブクラスをサブクラス化することにより、カスタムを追加する _validate_<rulename> 方法の時、あなたは利用可能なものを拡張しました 構造定義 文法は今新しいカスタマイズ規則です isodd あなたのアーキテクチャで利用できます。今、以下の動作を実行することができます。

'schema': {
    'oddity': {
        'isodd': True,
        'type': 'integer'
      }
}

Cerberusとイヴは function-based validation そして type coercion クラスのカスタム検証に基づく軽量代替案である.

カスタムデータタイプ

また、以下の内容を簡単に追加することで、新しいデータタイプを追加することができます _validate_type_<typename> メソッドをサブクラスに追加します。EVEソースコード中の以下のコード片を考慮してください。

def _validate_type_objectid(self, value):
    """ Enables validation for `objectid` schema attribute.

    :param value: field value.
    """
    if isinstance(value, ObjectId):
        return True

この手法はMongoDBをサポートしている. ObjectId 以下のことを可能にするアーキテクチャを入力します。

'schema': {
    'owner': {
        'type': 'objectid',
        'required': True,
    },
}

確認することもできます source code EVEカスタム検証の場合、実装のようなより高度な用例を見つけることができます unique そして data_relation 拘束する。

以下の詳細について:

注釈

私たちはデータ検証の毛皮だけに触れた。必ずチェックしてください Cerberus 文書は、利用可能な検証ルールおよびデータタイプの完全リストを取得する。

また、Cerberusはバージョン0.9.2に固定することを要求しており、このバージョンは依然としてサポートされています。 validate_update 使用する方法 PATCH お願いします。Cerberus 1.0+にアップグレードする計画はEVEバージョン0.8です。

未知の事物を許す

一般に、あなたはクライアントがあなたの文書に未知のフィールドを注入することを望んでいません。しかし、場合によってはそうする必要があるかもしれない。たとえば,開発周期において,あるいは非常に異種のデータを扱う場合である.結局,情報の標準化を強制しないことは,MongoDBや他の多くのNoSQLデータ格納の売りの1つである.

イヴでは設定することで ALLOW_UNKNOWN 選択権. True それがそうです。このオプションを有効にすると、パターンに一致するフィールドは正常に検証され、未知のフィールドは故障なく暗黙に格納される。属性は、ある終端ノードのためにのみこの機能を有効にすることもできます。 allow_unknown 地元のオプションです。

次のドメインを考えてください:

DOMAIN: {
    'people': {
        'allow_unknown': True,
        'schema': {
            'firstname': {'type': 'string'},
            }
        }
    }

通常は追加(配布)や編集(パッチ)しかできません firstnames 致す /people 端点.しかしその理由は allow_unknown 有効化されており、このような負荷であっても受け入れられる。

$ curl -d '[{"firstname": "bill", "lastname": "clinton"}, {"firstname": "bill", "age":70}]' -H 'Content-Type: application/json' http://myapi/people
HTTP/1.1 201 OK

ご注意ください

この機能を使うときは特に気をつけなければならない.なお、このオプションを有効にすると、クライアントは実際に adding パッチのフィールド(編集)を通過する.

ALLOW_UNKNOWN 基礎データベース中の文書全体を返す必要がある読み取り専用APIや終端ノードにも有用である.この場合、あなたは検証モデルを使用することを気にしたくない。先ほど設定されたAPI全体について ALLOW_UNKNOWN 至る True そして、そして schema: {{}} 各端点にあります。個々のサイトについては、ご利用ください allow_unknown: True 代わりに。

構造検証

デフォルトでは、中に記録された構造に適合することを保証するためにアーキテクチャが検証されます。 構造定義 それがそうです。

規範に合わないパターンを処理するために、追加してください 検証ルールをカスタマイズする. アーキテクチャで使用される不一致鍵。