亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Python Schema一種優(yōu)雅的數(shù)據(jù)驗(yàn)證方式

lijy91 / 2879人閱讀

摘要:意味著我們要對(duì)用戶輸入進(jìn)行嚴(yán)格的驗(yàn)證,開發(fā)時(shí)一般輸入數(shù)據(jù)都以形式發(fā)送到后端,要對(duì)輸入數(shù)據(jù)做驗(yàn)證。一般我都是加很多判斷,各種,導(dǎo)致代碼很丑陋,能不能有一種方式比較優(yōu)雅的驗(yàn)證用戶數(shù)據(jù)呢就派上用場(chǎng)了。

Python Schema使用說(shuō)明

項(xiàng)目地址:GitHub

Schema是什么?

不管我們做什么應(yīng)用,只要和用戶輸入打交道,就有一個(gè)原則--永遠(yuǎn)不要相信用戶的輸入數(shù)據(jù)。意味著我們要對(duì)用戶輸入進(jìn)行嚴(yán)格的驗(yàn)證,web開發(fā)時(shí)一般輸入數(shù)據(jù)都以JSON形式發(fā)送到后端API,API要對(duì)輸入數(shù)據(jù)做驗(yàn)證。一般我都是加很多判斷,各種if,導(dǎo)致代碼很丑陋,能不能有一種方式比較優(yōu)雅的驗(yàn)證用戶數(shù)據(jù)呢?Schema就派上用場(chǎng)了。

Schema非常簡(jiǎn)單,也就幾百行的代碼,最核心的類就一個(gè):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會(huì)去驗(yàn)證validate方法傳入的對(duì)象是不是所指定的類型,是則返回傳入的數(shù)據(jù),否則拋出一個(gè)SchemaError的異常(SchemaUnexpectedTypeErrorSchemaError的子類)。

2. 給Schema類傳入可調(diào)用的對(duì)象(函數(shù)、帶__call__的類等)

例如:

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

可見Schema會(huì)把validate方法傳入的值傳入到對(duì)應(yīng)的函數(shù)里面作為參數(shù),如果函數(shù)返回值為True則返回輸入數(shù)據(jù),否則拋出異常。

3. 給Schema類傳入帶有validate方法的對(duì)象

Schema也內(nèi)置了一些類(Use、And、Or等等),這些類的實(shí)例都帶有validate方法,亦可作為Schema的參數(shù)傳入,例如:

from schema import Schema, And

# And代表兩個(gè)條件必須同時(shí)滿足
Schema(And(str, lambda s: len(s) > 2)).validate("abcd")
"abcd"
4. 給Schema類傳入容器對(duì)象(list、tuple、set等)

例如:

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

相當(dāng)于,對(duì)于[1, 2, 3, 4.0]當(dāng)中的任何一個(gè)元素,必須是int或者float才行(注意是or的關(guān)系)

5. 給Schema傳入一個(gè)字典對(duì)象(大部分使用Schema的場(chǎng)景都是傳入字典對(duì)象,這個(gè)很重要)
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"

首先,明確兩個(gè)概念,Schema類傳入的字典,稱之為模式字典,valdiate方法傳入的字典稱之為數(shù)據(jù)字典。

首先,Schema會(huì)判斷, 模式字典和數(shù)據(jù)字典的key是否完全一樣,不一樣的話直接拋出異常。如果一樣,就去拿數(shù)據(jù)字典的value去驗(yàn)證模式字典相應(yīng)的value,如果數(shù)據(jù)字典的全部value都可以驗(yàn)證通過(guò)的話才返回?cái)?shù)據(jù),否則拋出異常,是不是感覺這種驗(yàn)證頓時(shí)感覺清爽了呢?

6. faqs

Schema傳入字典很好用,但是我有的數(shù)據(jù)是可選的,也就是說(shuō)有的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只驗(yàn)證傳入字典中的一部分?jǐn)?shù)據(jù),可以有多余的key但是不要抱錯(cuò),怎么做?

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

Schema拋出的異常信息不是很友好,我想自定義錯(cuò)誤信息,怎么辦?

Schema自帶的類(UseAnd、Or、RegexSchema等)都有一個(gè)參數(shù)error,可以自定義錯(cuò)誤信息

Schema({"name": str, "age": Use(int, error="年齡必須是整數(shù)")}).validate({"name": "foobar", "age": "abc"})
SchemaError: 年齡必須是整數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/40971.html

相關(guān)文章

  • 自動(dòng)化代碼生成工具 Snips 開發(fā)實(shí)踐

    摘要:今天我來(lái)和大家分享一下以及自動(dòng)化生成工具的開發(fā)經(jīng)驗(yàn)。代碼生成工具接著講講代碼生成工具,對(duì)于來(lái)講,有官方的代碼生成器,還有其他的同類開源項(xiàng)目比如。現(xiàn)有的代碼生成器沒(méi)有可以開箱即用的,都需要去進(jìn)行不少的修改。 前言 在開發(fā)工作中,經(jīng)常會(huì)遇到新產(chǎn)品、服務(wù)上線后,需要將其 API 編寫不同語(yǔ)言的 SDK。但不同語(yǔ)言 SDK 中都有很大一部分內(nèi)容是用來(lái)進(jìn)行 API 的描述,而且這部分代碼量是最大...

    only_do 評(píng)論0 收藏0
  • 自動(dòng)化代碼生成工具 Snips 開發(fā)實(shí)踐

    摘要:今天我來(lái)和大家分享一下以及自動(dòng)化生成工具的開發(fā)經(jīng)驗(yàn)。代碼生成工具接著講講代碼生成工具,對(duì)于來(lái)講,有官方的代碼生成器,還有其他的同類開源項(xiàng)目比如。現(xiàn)有的代碼生成器沒(méi)有可以開箱即用的,都需要去進(jìn)行不少的修改。 前言 在開發(fā)工作中,經(jīng)常會(huì)遇到新產(chǎn)品、服務(wù)上線后,需要將其 API 編寫不同語(yǔ)言的 SDK。但不同語(yǔ)言 SDK 中都有很大一部分內(nèi)容是用來(lái)進(jìn)行 API 的描述,而且這部分代碼量是最大...

    qc1iu 評(píng)論0 收藏0
  • 自動(dòng)化代碼生成工具 Snips 開發(fā)實(shí)踐

    摘要:今天我來(lái)和大家分享一下以及自動(dòng)化生成工具的開發(fā)經(jīng)驗(yàn)。代碼生成工具接著講講代碼生成工具,對(duì)于來(lái)講,有官方的代碼生成器,還有其他的同類開源項(xiàng)目比如。現(xiàn)有的代碼生成器沒(méi)有可以開箱即用的,都需要去進(jìn)行不少的修改。 前言 在開發(fā)工作中,經(jīng)常會(huì)遇到新產(chǎn)品、服務(wù)上線后,需要將其 API 編寫不同語(yǔ)言的 SDK。但不同語(yǔ)言 SDK 中都有很大一部分內(nèi)容是用來(lái)進(jìn)行 API 的描述,而且這部分代碼量是最大...

    pepperwang 評(píng)論0 收藏0
  • 做好自動(dòng)化 API 測(cè)試(1)- 從一個(gè)好用 Json Validator 開始

    摘要:就目前我的面試經(jīng)驗(yàn)而言,絕大部分項(xiàng)目都沒(méi)有引入自動(dòng)化測(cè)試,測(cè)試基本都是依靠開發(fā)人員的自測(cè)以及測(cè)試人員黑盒測(cè)試。本文不探討黑盒測(cè)試,僅僅發(fā)表一點(diǎn)我對(duì)自動(dòng)化測(cè)試的想法。緣起早在兩年多以前,就在思考如何做的測(cè)試,保證返回的結(jié)果與預(yù)期的一致。 目前,前后端分離的開發(fā)模式越來(lái)越受到大家的青睞,前端與后端的職責(zé)也更加清晰,后端通過(guò) API 提供數(shù)據(jù),前端通過(guò) API 獲取數(shù)據(jù),展示頁(yè)面,前端有更大...

    RancherLabs 評(píng)論0 收藏0
  • marshmallow快速上手

    摘要:方法對(duì)應(yīng)的是方法,它反序列化一個(gè)字典為數(shù)據(jù)結(jié)構(gòu)。某些例如和內(nèi)置了驗(yàn)證器驗(yàn)證集合時(shí),錯(cuò)誤字典將基于無(wú)效字段的索引作為鍵通過(guò)給的參數(shù)傳遞對(duì)象,可以執(zhí)行額外的驗(yàn)證驗(yàn)證函數(shù)可以返回布爾值或拋出異常。 快速上手 Declaring Schemas 首先創(chuàng)建一個(gè)基礎(chǔ)的user模型(只是為了演示,并不是真正的模型): import datetime as dt class User(object)...

    jhhfft 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<