这里已经很清楚的说明flask默认使用的表单验证方式了:http://docs.jinkan.org/docs/flask/patterns/wtforms.html
在我使用过的验证方式里,Laravel(流行的php框架)算是非常优雅的。所以这用laravel的思想来开发一个python的表单验证模块。
思想
- 不想写类,不想每次验证都要实例化一个类,即使程序背后的确是这么做的,我也不想看到,只希望像调用了一个方法似的使用。
- 语义化,需要看半天说明的功夫都用正则完成,最好一看例子就知道怎么用。
- 提示信息的国际化支持(多语言),并且自定义。
接口(实例)
def validate_min()
def validate_max()
def validate_between()
类
class Validation(object):
def __init__(self, data, rules):
self.data = data
self.rules = rules
def validate(self):
data, rules = self.data, self.rules
for key, rule in rules.items():
if not self.validate_one(key, data[key], rule):
return False
return True
def validate_one(self, key, value, rule):
rules = rule.split("|")
passed = True
for r in rules:
if ':' in r:
l = r.split(":")
method, limit = l[0], l[1]
if getattr(self, "validate_"+method):
func = getattr(self, 'validate_'+method)
if not func(value, limit):
passed = False
else:
raise BaseException("method validate_"+method+" is not exists")
else:
if getattr(self, 'validate_'+r):
func = getattr(self, 'validate_'+r)
if not func(key, value):
passed = False
else:
raise BaseException("method validate_"+r+" is not exists")
return passed
def validate_required(self, key,value):
return key in self.data
def validate_max(self, value, limit):
return len(value) <= int(limit)
def validate_min(self, value, limit):
return len(value) >= int(limit)
调用
v = Validation({'name': 'Tom'}, {'name': 'required|min:5'})
print(v.validate())