日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python数据校验_最近抽空造了一个数据校验的轮子 Python -validator

發(fā)布時(shí)間:2024/7/23 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python数据校验_最近抽空造了一个数据校验的轮子 Python -validator 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近抽空造了一個(gè)數(shù)據(jù)校驗(yàn)的輪子 python-validator。

在開(kāi)發(fā) web 應(yīng)用時(shí),經(jīng)常需要校驗(yàn)前端傳入的數(shù)據(jù)。如果使用 Django,那么可以使用自帶的 forms 進(jìn)行數(shù)據(jù)校驗(yàn)。

python-validator 的靈感也是來(lái)源于 Django 的 forms (類似 ORM 的方式定義數(shù)據(jù)結(jié)構(gòu)),不過(guò) python-validator 更加純粹,只是數(shù)據(jù)校驗(yàn),另外也支持使用 dict 定義數(shù)據(jù)結(jié)構(gòu),相比于使用類更加方便。

歡迎大家提建議。覺(jué)得不錯(cuò)麻煩給個(gè) star 吧!

下面是簡(jiǎn)單的介紹:

python-validator 是一個(gè)類似于 Django ORM 的數(shù)據(jù)校驗(yàn)庫(kù),適用與任何需要進(jìn)行數(shù)據(jù)校驗(yàn)的應(yīng)用,比較常見(jiàn)的是 Web 后端校驗(yàn)前端的輸入數(shù)據(jù)。

特性

支持 python2 和 python3。

使用類描述數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)字段一目了然。另外也支持使用字典定義數(shù)據(jù)結(jié)構(gòu)。

可以自動(dòng)生成用于測(cè)試的 mocking data。

可以打印出清晰的數(shù)據(jù)結(jié)構(gòu)。

易于擴(kuò)展。

依賴

six

IPy

pytz[可選,DatetimeField 的 tzinfo 參數(shù)需要一個(gè) tzinfo 對(duì)象]

安裝

pip install python-validator

快速入門

假設(shè)現(xiàn)在正在開(kāi)發(fā)一個(gè)上傳用戶信息的接口 POST /api/user/,用戶信息如下:

name

string,必選。

age

integer,可選,默認(rèn) 20。

sex

string, 'f'表示女, 'm'表示男。可選, 默認(rèn) None。

原始的、枯燥無(wú)味的、重復(fù)性勞動(dòng)的數(shù)據(jù)校驗(yàn)代碼可能是下面這樣:

def user(request):

# data = json.loads(request.body)

data = {

'age': '24f',

'sex': 'f'

}

name = data.get('name')

age = data.get('age', 20)

sex = dage.get('sex')

if name is None or len(name) == 0:

return Response('必須提供 name', status=400)

try:

age = int(age)

except ValueError as e:

return Response('age 格式錯(cuò)誤', status=400)

if sex is not None and sex not in ('f', 'm'):

return Response('sex 格式錯(cuò)誤', status=400)

user_info = {

'name': name,

'age': age,

'sex': sex,

}

...

上面這段代碼總的來(lái)說(shuō)有幾個(gè)問(wèn)題:

枯燥無(wú)味和重復(fù)性代碼,不斷的取出數(shù)據(jù),檢查字段是否缺失,類型是否合法等等。

從數(shù)據(jù)校驗(yàn)的代碼無(wú)法輕易看出用戶信息的數(shù)據(jù)結(jié)構(gòu),即字段是什么類型的,是否可選,默認(rèn)值是什么。

使用 python-validator 校驗(yàn)數(shù)據(jù)

首先定義一個(gè) UserInfoValidator 類

# validators.py

from validator import Validator, StringField, IntegerField, EnumField

class UserInfoValidator(Validator):

name = StringField(max_length=50, required=True)

age = IntegerField(min_value=1, max_value=120, default=20)

sex = EnumField(choices=['f', 'm'])

接下來(lái)使用 UserInfoValidator 進(jìn)行數(shù)據(jù)校驗(yàn),

from .validators import UserInfoValidator

def user(request):

# data = json.loads(request.body)

data = {

'age': '24',

'sex': 'f'

}

v = UserInfoValidator(data)

if not v.is_valid():

return Response({'msg': v.str_errors, 'code': 400}, status=400)

user_info = v.validated_data

...

v.str_errors 是一個(gè)字段名 - 錯(cuò)誤信息的 dict,例如:

{'age': 'got a wrong type: str, expect integer', 'name': 'Field is required'}

錯(cuò)誤信息解釋:

age 等于 "24",不是合法的 int 類型。

name 是必須提供的,且沒(méi)有指定默認(rèn)值。

v.validated_data 是校驗(yàn)后合法的數(shù)據(jù),例如:

{'age': 24, 'name': u'Michael', 'sex': 'f'}

下面是一些錯(cuò)誤數(shù)據(jù)的例子:

data: {'age': 24, 'name': 'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc', 'sex': 'f'}

is_valid: False

errors: {'name': 'string is too long, max-lenght is 50'}

validated_data: None

data: {'age': 24, 'name': 'Michael', 'sex': 'c'}

is_valid: False

errors: {'sex': "'c' not in the choices"}

validated_data: None

總結(jié)

以上是生活随笔為你收集整理的python数据校验_最近抽空造了一个数据校验的轮子 Python -validator的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。