- 封装了 https://github.com/mansam/validator.py, 扩展了字符串校验,部分使用方法可以参考此处,考虑到代码比较少,可以直接copy
- validator_func针对包含可变长参数的函数的校验和修改,同样,这个方法也是可以脱离flask使用的,,所以如果需要就直接copy过去吧.
- validator_sub 针对request.json/requests.values的参数校验,修改,再返回dict提供后面时候,本质上没有修改request的属性只是校验,当然校验的方式可以自己写扩展
- validator 变更了request的参数的存储方式request.parameter_storage_class = MultiDict,设置为可修改,后面就可以灵活的修改request.args/form/json的值了,就当一个普通的dict使用就行.ps:官方不建议这么做
- 我curl测试了一些,可能不完整,要是担心的话,参考这里 https://github.com/mansam/validator.py/blob/master/tests/test_validator.py
- 具体的使用方法都写字了flask_validator_exampleXXX中了,可以参考一下.
- 支持python2和python3
# curl "http://127.0.0.1:6000/wrap" -d "a=123&b=123&c=spam&d=123&e=1236&f=123&g=spa1&h=11%&i=12&j=bar&k=32&l=abc&m=123"
{
"code": 200,
"data": {
"a": "123",
"b": "123",
"c": "spam",
"d": "123",
"e": "1236",
"f": "123",
"g": "spa1",
"h": "11%",
"i": "12",
"j": "bar",
"k": "32",
"l": "abc",
"m": "123"
},
"err": null
}
# curl "http://127.0.0.1:5000/wrap" -d "a=123&b=123&c=spam&d=123&e=1236&f=123&g=spa1&h=11%&i=12&j=bar&k=32&l=abc&m=123 "
{"code":500,"data":null,"err":"m should not contain spaces"}
# curl "http://127.0.0.1:5000/wrap" -d "a=123&b=123&c=spam&d=13&e=1236&f=123&g=spa1&h=11%&i=12&j=bar&k=32&l=abc&m=123"
{"code":500,"data":null,"err":{"d":["must not fall between 1 and 100"]}}
# curl "http://127.0.0.1:5000/wrap" -d "a=1234&b=&c=nospam&d=13&e=123456&f=123&g=spa1&h=11%&i=12&j=bar&k=3a2&l=1abc&m=123a"
{"code":500,"data":null,"err":{"a":["must be equal to '123'"],"b":["must be True-equivalent value"],"c":["must be one of ['spam', 'eggs', 'bacon']"],"d":["must not fall between 1 and 100"],"e":["must be at most 5 elements in length"],"l":["must be all letters"],"m":["must be all numbers"]}}
from validator import Required, Not, Truthy, Blank, Range, Equals, In, validate
# let's say that my dictionary needs to meet the following rules...
rules = {
"foo": [Required, Equals(123)], # foo must be exactly equal to 123
"bar": [Required, Truthy()], # bar must be equivalent to True
"baz": [In(["spam", "eggs", "bacon"])], # baz must be one of these options
"qux": [Not(Range(1, 100))] # qux must not be a number between 1 and 100 inclusive
}
# then this following dict would pass:
passes = {
"foo": 123,
"bar": True, # or a non-empty string, or a non-zero int, etc...
"baz": "spam",
"qux": 101
}
>>> validate(rules, passes)
(True, {})
# but this one would fail
fails = {
"foo": 321,
"bar": False, # or 0, or [], or an empty string, etc...
"baz": "barf",
"qux": 99
}
>>> validate(rules, fails)
(False, {
'foo': ["must be equal to 123"],
'bar': ['must be True-equivalent value'],
'baz': ["must be one of ['spam', 'eggs', 'bacon']"],
'qux': ['must not fall between 1 and 100']
})