国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python通過(guò)Schema實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證方式

瀏覽:3日期:2022-07-05 17:21:55

Schema是什么?

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

Schema非常簡(jiǎn)單,也就幾百行的代碼,最核心的類(lèi)就一個(gè):Schema。

1. 給Schema類(lèi)傳入類(lèi)型(int、str、float等)

例如:

from schema import Schema

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

可見(jiàn)Schema會(huì)去驗(yàn)證validate方法傳入的對(duì)象是不是所指定的類(lèi)型,是則返回傳入的數(shù)據(jù),否則拋出一個(gè)SchemaError的異常(SchemaUnexpectedTypeError是SchemaError的子類(lèi))。

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

例如:

Schema(lambda x: 0<x<10).validate(5)5Schema(lambda x: 0<x<10).validate(57)SchemaError: <lambda>(57) should evaluate to True

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

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

Schema也內(nèi)置了一些類(lèi)(Use、And、Or等等),這些類(lèi)的實(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類(lèi)傳入容器對(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類(lèi)傳入的字典,稱(chēng)之為模式字典,valdiate方法傳入的字典稱(chēng)之為數(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ù),否則拋出異常,是不是感覺(jué)這種驗(yàn)證頓時(shí)感覺(jué)清爽了呢?

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自帶的類(lèi)(Use、And、Or、Regex、Schema等)都有一個(gè)參數(shù)error,可以自定義錯(cuò)誤信息

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

SchemaError: 年齡必須是整數(shù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产精品区牛牛影院 | 青青自拍 | 亚洲精品不卡视频 | 国产精品三级国语在线看 | 国产精品成人网 | 国产猛烈无遮掩视频免费网站男女 | 日韩毛片免费在线观看 | 手机在线看片国产日韩生活片 | 国产午夜小视频 | 国产精亚洲视频 | 日韩在线观看一区二区三区 | 亚洲 中文 欧美 日韩 在线人 | 欧美国产精品亚洲精品第一区 | 97公开免费视频 | 亚洲精品美女国产一区 | 波多野结衣中文在线播放 | 久久精品3| 波野多结衣在线观看 | 无套内谢孕妇毛片免费看 | 动漫精品一区二区 | 国产精品高清在线观看地址 | 2022男人天堂 | 步兵一区二区三区在线观看 | 国产精品日韩欧美一区二区 | 精品国产乱码久久久久久一区二区 | 国产精品久久影院 | 欧美成人亚洲欧美成人 | 911国产自产精选 | 精品久久久久久久久久中文字幕 | 成 人 亚洲 综合天堂 | 一区二区三区亚洲 | 国产成人久久久精品毛片 | 欧美成人乱弄视频 | 久草网视频在线观看 | 欧美激情精品久久久久 | 手机看片久久国产免费不卡 | 毛色毛片免费看 | 中文字幕在线观看日韩 | 国产欧美日韩综合二区三区 | 日韩一区二区三区在线播放 | 亚洲九九香蕉 |