摘要:隨著前后端分離和的火熱,開發者不斷尋找著一種靈活的優雅的方式驗證數據。有直接手動獲取數據驗證的,也有使用驗證的。但刪去了的表單渲染部分,更改了傳入的數據格式,最重要的是使用正確的邏輯驗證數組和對象類型。
隨著前后端分離和 REST APIs 的火熱,開發者不斷尋找著一種靈活的、優雅的方式驗證 json 數據。有直接手動獲取數據驗證的,也有使用 json scheme 驗證的。前者容易使得函數變得冗長,還可能存在不少重復的驗證;后者驗證又不靈活。
本文介紹的 jsonlint 啟發自 python 的表單驗證工具 wtforms,wtforms 通過繼承 Form 類也能進行 json 數據驗證,但是 wtforms 對于 json 的數組(Array)類型處理有著很詭異的行為,需要通過 a-1 、 a-2 這樣來傳遞數組數據,常常不能有效的處理數組數據。 jsonlint 大部分代碼來著 wtforms,可以視為 wtforms 的一個分支。但 jsonlint 刪去了 wtforms 的表單渲染部分,更改了傳入的數據格式,最重要的是使用正確的邏輯驗證數組(Array)和對象(Object)類型。下面是一些例子:
基本的字符串類型json驗證對于基本的字符串類型,我們只需要創建一個 Json 的子類,填寫對應的 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 數據
jsonlint 繼承了 wtforms 的優點,可以進行一些更靈活的自定義json數據驗證,只要將 field 類的實例名寫成函數 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"]對數組類型進行驗證
jsonlint 誕生可以說主要就是為了解決如何驗證數組類型的問題,在jsonlint這很容易實現:
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 的數組,將對應類型的數組直接傳入,即可有效的驗證;ListField 同樣也可以進行自定義驗證。
對對象類型進行驗證對象類型在一些 REST APIs 的 web 應用中也經常存在,對此 jsonlint 也作了支持。只要將 Json 子類傳入 ObjectField 中即可進行驗證:
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,這樣不但有著良好的驗證方式,還可以分割業務,避免接口主函數變得十分冗長。例如,可以定義類:
class RegisterLint(UserLint): def validata_nickname(self, field): ... def validate_account(self, field): ... def create_user(self): ... user = RegisterLint()
這樣既可以使用 RegisterLint 的實例 user 驗證數據,同時又能直接執行 user.create_user() 進行數據庫操作,將數據庫邏輯更好的封裝。這樣可以說是在 MVC 設計模式的基礎上獨立出了一層。
想要嘗試使用 jsonlint 可以直接使用 pip 安裝:
pip install jsonlint
最后,jsonlint 開源在 Github : https://github.com/tangwz/jso...
jsonlint 現階段僅由我一人維護,雖然單元測試覆蓋率盡可能的全覆蓋,但也不代表沒有bug,希望您提出您寶貴的意見,或一起維護、迭代jsonlint:https://github.com/tangwz/jso...
如果使用 Flask 進行 web 開發,也可以使用封裝好的結合了 Flask 和 jsonlint 的庫: Flask-Lint
原文地址:http://tangwz.com/2017/11/28/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44522.html
摘要:是什么是一種輕量級的數據交換格式,采用完全獨立于語言的文本格式,是理想的數據交換格式。同時,是原生格式,這意味著在中處理數據不需要任何特殊的或工具包。底層存儲為格式是個構建在之上的新型查詢語言。 JSON是什么? JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,采用完全獨立于語言的文本格式,是理想的數據交換格式。同時,JSON是 Java...
摘要:名稱用途說明說明地址簡單易用的請求庫官網地址功能強大的請求庫文檔輕量級配置加載類支持多種配置格式簡單的緩存類提供多種緩存驅動數字生成類似優酷視頻支持多語言支持加鹽生成官網地址網站地圖生成器簡單易用數據庫操作類支持各種常見數據庫文檔生成 名稱 用途說明 說明地址 mashape/unirest-php 簡單易用的HTTP請求庫 官網地址 guzzlehttp/guzzle ...
摘要:響應一般由三個部分組成由一個數字和文字組成的狀態碼,用來顯示請求是成功還是失敗響應頭,包含服務器類型,日期時間,內容類型和長度等響應體,也就是響應正文。獲得形式的相應數據。和以數字和文本形式返回狀態碼。 學習目錄: AJAX基礎 PHP與AJAX JSON格式 jQuery中的AJAX 個人網站原創鏈接地址:不足之處歡迎留言...逃... showImg(https://segm...
摘要:響應一般由三個部分組成由一個數字和文字組成的狀態碼,用來顯示請求是成功還是失敗響應頭,包含服務器類型,日期時間,內容類型和長度等響應體,也就是響應正文。獲得形式的相應數據。和以數字和文本形式返回狀態碼。 學習目錄: AJAX基礎 PHP與AJAX JSON格式 jQuery中的AJAX 個人網站原創鏈接地址:不足之處歡迎留言...逃... showImg(https://segm...
閱讀 3639·2021-11-24 09:38
閱讀 3142·2021-11-15 11:37
閱讀 781·2021-11-12 10:36
閱讀 3547·2021-10-21 09:38
閱讀 3220·2021-09-28 09:36
閱讀 2420·2021-09-22 16:01
閱讀 4986·2021-09-22 15:09
閱讀 1210·2019-08-30 15:55