成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

jsonlint:python的json數(shù)據(jù)驗證庫

Cc_2011 / 3272人閱讀

摘要:隨著前后端分離和的火熱,開發(fā)者不斷尋找著一種靈活的優(yōu)雅的方式驗證數(shù)據(jù)。有直接手動獲取數(shù)據(jù)驗證的,也有使用驗證的。但刪去了的表單渲染部分,更改了傳入的數(shù)據(jù)格式,最重要的是使用正確的邏輯驗證數(shù)組和對象類型。

隨著前后端分離和 REST APIs 的火熱,開發(fā)者不斷尋找著一種靈活的、優(yōu)雅的方式驗證 json 數(shù)據(jù)。有直接手動獲取數(shù)據(jù)驗證的,也有使用 json scheme 驗證的。前者容易使得函數(shù)變得冗長,還可能存在不少重復(fù)的驗證;后者驗證又不靈活。

本文介紹的 jsonlint 啟發(fā)自 python 的表單驗證工具 wtforms,wtforms 通過繼承 Form 類也能進(jìn)行 json 數(shù)據(jù)驗證,但是 wtforms 對于 json 的數(shù)組(Array)類型處理有著很詭異的行為,需要通過 a-1 、 a-2 這樣來傳遞數(shù)組數(shù)據(jù),常常不能有效的處理數(shù)組數(shù)據(jù)。 jsonlint 大部分代碼來著 wtforms,可以視為 wtforms 的一個分支。但 jsonlint 刪去了 wtforms 的表單渲染部分,更改了傳入的數(shù)據(jù)格式,最重要的是使用正確的邏輯驗證數(shù)組(Array)和對象(Object)類型。下面是一些例子:

基本的字符串類型json驗證

對于基本的字符串類型,我們只需要創(chuàng)建一個 Json 的子類,填寫對應(yīng)的 Field 即可。使用方式和 wtforms 類型:

from jsonlint import Json
from jsonlint.fields import StringField
from jsonlint.validators import DataRequired

class MyLint(Json):
    name = StringField(validators=[DataRequired()])

mylint = MyLint({"name": "demo"})
print mylint.validate()  # True
print mylint.name.data  # demo
更靈活的驗證 json 數(shù)據(jù)

jsonlint 繼承了 wtforms 的優(yōu)點(diǎn),可以進(jìn)行一些更靈活的自定義json數(shù)據(jù)驗證,只要將 field 類的實(shí)例名寫成函數(shù) validate_fieldname ,即可自定義驗證改字段:

from jsonlint import Json
from jsonlint.fields import IntegerField
from jsonlint.validators import ValidationError

class AgeLint(Json):
    age = IntegerField()

    def validate_age(form, field):
        if field.data < 13:
            raise ValidationError("We"re sorry, you must be 13 or older to register")

agelint = AgeLint({"age": 12})
print agelint.validate()  # False
print agelint.age.errors  # ["We"re sorry, you must be 13 or older to register"]
對數(shù)組類型進(jìn)行驗證

jsonlint 誕生可以說主要就是為了解決如何驗證數(shù)組類型的問題,在jsonlint這很容易實(shí)現(xiàn):

from jsonlint import Json
from jsonlint.fields import StringField, ListField
from jsonlint.validators import DataRequired, ValidationError

class ListLint(Json):
    cars = ListField(StringField(validators=[DataRequired()]))

    def validate_cars(form, field):
        if "BMW" in field.data:
            raise ValidationError("We"re sorry, you cannot drive BMW")

listlint = ListLint({"cars": ["Benz", "BMW", "Audi"]})
print listlint.validate()  # False
print listlint.cars.errors  # ["We"re sorry, you cannot drive BMW"]

ListField 類作為一個 Field 容器,容納其它類型 Field 的數(shù)組,將對應(yīng)類型的數(shù)組直接傳入,即可有效的驗證;ListField 同樣也可以進(jìn)行自定義驗證。

對對象類型進(jìn)行驗證

對象類型在一些 REST APIs 的 web 應(yīng)用中也經(jīng)常存在,對此 jsonlint 也作了支持。只要將 Json 子類傳入 ObjectField 中即可進(jìn)行驗證:

from jsonlint import Json
from jsonlint.fields import ObjectField, IntegerField, BooleanField

class T(Json):
    status = BooleanField()
    code = IntegerField()

class DataLint(Json):
    data = ObjectField(T)

datalint = DataLint({"data": {"status": True, "code": 200}})
print datalint.validate()  # False
print datalint.data.code.data  # 200
寫在最后

jsonlint 誕生初衷就是因為本人想用類似 wtforms 的方式來驗證json,這樣不但有著良好的驗證方式,還可以分割業(yè)務(wù),避免接口主函數(shù)變得十分冗長。例如,可以定義類:

class RegisterLint(UserLint):
    def validata_nickname(self, field):
        ...

    def validate_account(self, field):
        ...

    def create_user(self):
        ...

user = RegisterLint()

這樣既可以使用 RegisterLint 的實(shí)例 user 驗證數(shù)據(jù),同時又能直接執(zhí)行 user.create_user() 進(jìn)行數(shù)據(jù)庫操作,將數(shù)據(jù)庫邏輯更好的封裝。這樣可以說是在 MVC 設(shè)計模式的基礎(chǔ)上獨(dú)立出了一層。

想要嘗試使用 jsonlint 可以直接使用 pip 安裝:

pip install jsonlint

最后,jsonlint 開源在 Github : https://github.com/tangwz/jso...

jsonlint 現(xiàn)階段僅由我一人維護(hù),雖然單元測試覆蓋率盡可能的全覆蓋,但也不代表沒有bug,希望您提出您寶貴的意見,或一起維護(hù)、迭代jsonlint:https://github.com/tangwz/jso...

如果使用 Flask 進(jìn)行 web 開發(fā),也可以使用封裝好的結(jié)合了 Flask 和 jsonlint 的庫: Flask-Lint

原文地址:http://tangwz.com/2017/11/28/...

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44522.html

相關(guān)文章

  • JSON數(shù)據(jù)格式及其在WEB開發(fā)中應(yīng)用

    摘要:是什么是一種輕量級的數(shù)據(jù)交換格式,采用完全獨(dú)立于語言的文本格式,是理想的數(shù)據(jù)交換格式。同時,是原生格式,這意味著在中處理數(shù)據(jù)不需要任何特殊的或工具包。底層存儲為格式是個構(gòu)建在之上的新型查詢語言。 JSON是什么? JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,采用完全獨(dú)立于語言的文本格式,是理想的數(shù)據(jù)交換格式。同時,JSON是 Java...

    red_bricks 評論0 收藏0
  • 常用 composer 包推薦

    摘要:名稱用途說明說明地址簡單易用的請求庫官網(wǎng)地址功能強(qiáng)大的請求庫文檔輕量級配置加載類支持多種配置格式簡單的緩存類提供多種緩存驅(qū)動數(shù)字生成類似優(yōu)酷視頻支持多語言支持加鹽生成官網(wǎng)地址網(wǎng)站地圖生成器簡單易用數(shù)據(jù)庫操作類支持各種常見數(shù)據(jù)庫文檔生成 名稱 用途說明 說明地址 mashape/unirest-php 簡單易用的HTTP請求庫 官網(wǎng)地址 guzzlehttp/guzzle ...

    Tamic 評論0 收藏0
  • PHP與AJAX相愛相殺

    摘要:響應(yīng)一般由三個部分組成由一個數(shù)字和文字組成的狀態(tài)碼,用來顯示請求是成功還是失敗響應(yīng)頭,包含服務(wù)器類型,日期時間,內(nèi)容類型和長度等響應(yīng)體,也就是響應(yīng)正文。獲得形式的相應(yīng)數(shù)據(jù)。和以數(shù)字和文本形式返回狀態(tài)碼。 學(xué)習(xí)目錄: AJAX基礎(chǔ) PHP與AJAX JSON格式 jQuery中的AJAX 個人網(wǎng)站原創(chuàng)鏈接地址:不足之處歡迎留言...逃... showImg(https://segm...

    wthee 評論0 收藏0
  • PHP與AJAX相愛相殺

    摘要:響應(yīng)一般由三個部分組成由一個數(shù)字和文字組成的狀態(tài)碼,用來顯示請求是成功還是失敗響應(yīng)頭,包含服務(wù)器類型,日期時間,內(nèi)容類型和長度等響應(yīng)體,也就是響應(yīng)正文。獲得形式的相應(yīng)數(shù)據(jù)。和以數(shù)字和文本形式返回狀態(tài)碼。 學(xué)習(xí)目錄: AJAX基礎(chǔ) PHP與AJAX JSON格式 jQuery中的AJAX 個人網(wǎng)站原創(chuàng)鏈接地址:不足之處歡迎留言...逃... showImg(https://segm...

    Clect 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<