python数据校验_最近抽空造了一个数据校验的轮子 Python -validator
最近抽空造了一個數據校驗的輪子 python-validator。
在開發 web 應用時,經常需要校驗前端傳入的數據。如果使用 Django,那么可以使用自帶的 forms 進行數據校驗。
python-validator 的靈感也是來源于 Django 的 forms (類似 ORM 的方式定義數據結構),不過 python-validator 更加純粹,只是數據校驗,另外也支持使用 dict 定義數據結構,相比于使用類更加方便。
歡迎大家提建議。覺得不錯麻煩給個 star 吧!
下面是簡單的介紹:
python-validator 是一個類似于 Django ORM 的數據校驗庫,適用與任何需要進行數據校驗的應用,比較常見的是 Web 后端校驗前端的輸入數據。
特性
支持 python2 和 python3。
使用類描述數據結構,數據字段一目了然。另外也支持使用字典定義數據結構。
可以自動生成用于測試的 mocking data。
可以打印出清晰的數據結構。
易于擴展。
依賴
six
IPy
pytz[可選,DatetimeField 的 tzinfo 參數需要一個 tzinfo 對象]
安裝
pip install python-validator
快速入門
假設現在正在開發一個上傳用戶信息的接口 POST /api/user/,用戶信息如下:
name
string,必選。
age
integer,可選,默認 20。
sex
string, 'f'表示女, 'm'表示男。可選, 默認 None。
原始的、枯燥無味的、重復性勞動的數據校驗代碼可能是下面這樣:
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 格式錯誤', status=400)
if sex is not None and sex not in ('f', 'm'):
return Response('sex 格式錯誤', status=400)
user_info = {
'name': name,
'age': age,
'sex': sex,
}
...
上面這段代碼總的來說有幾個問題:
枯燥無味和重復性代碼,不斷的取出數據,檢查字段是否缺失,類型是否合法等等。
從數據校驗的代碼無法輕易看出用戶信息的數據結構,即字段是什么類型的,是否可選,默認值是什么。
使用 python-validator 校驗數據
首先定義一個 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'])
接下來使用 UserInfoValidator 進行數據校驗,
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 是一個字段名 - 錯誤信息的 dict,例如:
{'age': 'got a wrong type: str, expect integer', 'name': 'Field is required'}
錯誤信息解釋:
age 等于 "24",不是合法的 int 類型。
name 是必須提供的,且沒有指定默認值。
v.validated_data 是校驗后合法的數據,例如:
{'age': 24, 'name': u'Michael', 'sex': 'f'}
下面是一些錯誤數據的例子:
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
總結
以上是生活随笔為你收集整理的python数据校验_最近抽空造了一个数据校验的轮子 Python -validator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代软件工程 其实还是人的问题
- 下一篇: c语言与python通信_C和Pytho