国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python Schema一種優雅的數據驗證方式

lijy91 / 2813人閱讀

摘要:意味著我們要對用戶輸入進行嚴格的驗證,開發時一般輸入數據都以形式發送到后端,要對輸入數據做驗證。一般我都是加很多判斷,各種,導致代碼很丑陋,能不能有一種方式比較優雅的驗證用戶數據呢就派上用場了。

Python Schema使用說明

項目地址:GitHub

Schema是什么?

不管我們做什么應用,只要和用戶輸入打交道,就有一個原則--永遠不要相信用戶的輸入數據。意味著我們要對用戶輸入進行嚴格的驗證,web開發時一般輸入數據都以JSON形式發送到后端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(57) should evaluate to True

可見Schema會把validate方法傳入的值傳入到對應的函數里面作為參數,如果函數返回值為True則返回輸入數據,否則拋出異常。

3. 給Schema類傳入帶有validate方法的對象

Schema也內置了一些類(Use、AndOr等等),這些類的實例都帶有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自帶的類(UseAndOr、Regex、Schema等)都有一個參數error,可以自定義錯誤信息

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40971.html

相關文章

  • 自動化代碼生成工具 Snips 開發實踐

    摘要:今天我來和大家分享一下以及自動化生成工具的開發經驗。代碼生成工具接著講講代碼生成工具,對于來講,有官方的代碼生成器,還有其他的同類開源項目比如。現有的代碼生成器沒有可以開箱即用的,都需要去進行不少的修改。 前言 在開發工作中,經常會遇到新產品、服務上線后,需要將其 API 編寫不同語言的 SDK。但不同語言 SDK 中都有很大一部分內容是用來進行 API 的描述,而且這部分代碼量是最大...

    only_do 評論0 收藏0
  • 自動化代碼生成工具 Snips 開發實踐

    摘要:今天我來和大家分享一下以及自動化生成工具的開發經驗。代碼生成工具接著講講代碼生成工具,對于來講,有官方的代碼生成器,還有其他的同類開源項目比如?,F有的代碼生成器沒有可以開箱即用的,都需要去進行不少的修改。 前言 在開發工作中,經常會遇到新產品、服務上線后,需要將其 API 編寫不同語言的 SDK。但不同語言 SDK 中都有很大一部分內容是用來進行 API 的描述,而且這部分代碼量是最大...

    qc1iu 評論0 收藏0
  • 自動化代碼生成工具 Snips 開發實踐

    摘要:今天我來和大家分享一下以及自動化生成工具的開發經驗。代碼生成工具接著講講代碼生成工具,對于來講,有官方的代碼生成器,還有其他的同類開源項目比如。現有的代碼生成器沒有可以開箱即用的,都需要去進行不少的修改。 前言 在開發工作中,經常會遇到新產品、服務上線后,需要將其 API 編寫不同語言的 SDK。但不同語言 SDK 中都有很大一部分內容是用來進行 API 的描述,而且這部分代碼量是最大...

    pepperwang 評論0 收藏0
  • 做好自動化 API 測試(1)- 從一個好用 Json Validator 開始

    摘要:就目前我的面試經驗而言,絕大部分項目都沒有引入自動化測試,測試基本都是依靠開發人員的自測以及測試人員黑盒測試。本文不探討黑盒測試,僅僅發表一點我對自動化測試的想法。緣起早在兩年多以前,就在思考如何做的測試,保證返回的結果與預期的一致。 目前,前后端分離的開發模式越來越受到大家的青睞,前端與后端的職責也更加清晰,后端通過 API 提供數據,前端通過 API 獲取數據,展示頁面,前端有更大...

    RancherLabs 評論0 收藏0
  • marshmallow快速上手

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

    jhhfft 評論0 收藏0

發表評論

0條評論

lijy91

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<