更优雅的表单验证

这里已经很清楚的说明flask默认使用的表单验证方式了:http://docs.jinkan.org/docs/flask/patterns/wtforms.html
在我使用过的验证方式里,Laravel(流行的php框架)算是非常优雅的。所以这用laravel的思想来开发一个python的表单验证模块。

思想

  1. 不想写类,不想每次验证都要实例化一个类,即使程序背后的确是这么做的,我也不想看到,只希望像调用了一个方法似的使用。
  2. 语义化,需要看半天说明的功夫都用正则完成,最好一看例子就知道怎么用。
  3. 提示信息的国际化支持(多语言),并且自定义。

接口(实例)

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())

你可能感兴趣的:(更优雅的表单验证)