python数据校验_最近抽空造了一个数据校验的轮子 Python -validator
最近抽空造了一個(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)題。
- 上一篇: 现代软件工程 其实还是人的问题
- 下一篇: websocket python爬虫_p