av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

Python通過Schema實現數據驗證方式

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

Schema是什么?

不管我們做什么應用,只要和用戶輸入打交道,就有一個原則--永遠不要相信用戶的輸入數據。意味著我們要對用戶輸入進行嚴格的驗證,web開發時一般輸入數據都以JSON形式發送到后端API,API要對輸入數據做驗證。一般我都是加很多判斷,各種if,導致代碼很丑陋,能不能有一種方式比較優雅的驗證用戶數據呢?Schema就派上用場了。

Schema非常簡單,也就幾百行的代碼,最核心的類就一個:Schema。

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

例如:

from schema import Schema

Schema(int).validate(10)10Schema(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)5Schema(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. faqs

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但是不要抱錯,怎么做?

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: 年齡必須是整數

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 男插女下体视频 | 亚洲综合在线视频 | 国产在线二区 | 中文字幕在线观看 | 久久成人18免费网站 | 精品视频在线一区 | 天堂在线中文字幕 | 国产成人在线播放 | av一二三区| 亚洲一区二区三区免费观看 | 精品伊人 | 日韩电影一区 | 成人影院免费视频 | 五月天婷婷丁香 | 中文字幕丁香5月 | 99免费精品视频 | 欧美在线视频一区 | 日本韩国电影免费观看 | 亚洲精品在线视频 | 国产在线视频一区二区 | 亚洲精选一区二区 | 在线日韩视频 | 亚洲精品久久久一区二区三区 | 久久夜色精品国产 | 欧美一级视频 | 国产japanhdxxxx麻豆 | 亚洲精品久久 | 精品少妇一区二区三区日产乱码 | 国产精品一区二区久久久久 | 欧美国产日韩在线 | 精品国产乱码久久久久久丨区2区 | 色.com| 日本黄色大片免费 | 99精品在线 | 成人福利网站 | 日韩在线不卡 | 羞羞视频在线观看网站 | 色综合久久天天综合网 | 亚洲资源站| 久久一区二区三区四区 | 国产成人99久久亚洲综合精品 |