這里已經很清楚的說明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())