zoukankan      html  css  js  c++  java
  • form的valid验证的原理

    form的valid验证的原理

    import re
    import copy
    
    
    class ValidateError(Exception):
        def __init__(self,detail):
            self.detail = detail
    
    
    
    # ###################### 插件
    class TextInput(object):
        def __str__(self):
            return "<input type='text' />"
    
    class EmailInput(object):
        def __str__(self):
            return "<input type='email' />"
    
    
    
    
    # ###################### 内部包含正则,用于验证
    class Field(object):
        def __init__(self,required=True,error_messages=None,widget=None):
            self.required = required
            self.error_messages = error_messages
            if not widget:
                self.widget = TextInput()
            else:
                self.widget = widget
        def __str__(self):
            return str(self.widget)
    
    class CharField(Field):
    
        def valid(self,val):
            if self.required:
                if not val:
                    msg = self.error_messages['required']
                    raise ValidateError(msg)
            return val
    
    
    class EmailField(Field):
        REG = "^w+@w+$"
    
        def valid(self,val):
            if self.required:
                if not val:
                    msg = self.error_messages['required']
                    raise ValidateError(msg)
            result = re.match(self.REG,val)
            if not result:
                msg = self.error_messages.get('invalid','格式错误')
                raise ValidateError(msg)
            return val
    
    
    
    
    
    # ###################### Form,获取用户提交内容+获取定义的字段对象
    class Form(object):
    
        def __init__(self,data=None):
            # 获取派生类中的所有静态字段
            # print(self.__class__.__dict__)
            self.data = data
            self.fields = copy.deepcopy(self.__class__.declare_field)
            self.cleaned_data = {}
            self.errors = {}
    
        def __new__(cls, *args, **kwargs):
            declare_field = {}
            for field_name, field in cls.__dict__.items():
                if isinstance(field,Field):
                    declare_field[field_name] = field
            cls.declare_field = declare_field
            return object.__new__(cls)
    
        def is_valid(self):
            # 用户提交的数据
            # self.data # {"username":"alex","pwd":18,'xxx':11}
            # self.fields # {"username":CharField(), "pwd": EmailField() }
            for field_name,filed in self.fields.items():
                try:
                    input_val = self.data.get(field_name)
                    val = filed.valid(input_val)
                    method = getattr(self,"cleaned_%s" %field_name,None)
                    if method:
                        val = method(val)
                    self.cleaned_data[field_name] = val
                except ValidateError as e:
                    self.errors[field_name] = e.detail
    
            return len(self.errors) == 0
    
        def __iter__(self):
    
            return iter(self.fields.values())
    
    class UserForm(Form):
        username = CharField(error_messages={'required':'用户名不能为空'},widget=TextInput())
        pwd = EmailField(error_messages={'required':'密码不能为空','invalid':'密码格式错误'},widget=EmailInput())
    
    
    
    # ############### 应用
    obj = UserForm(data={"username":"sdf","pwd":"sdf",'xxx':666})
    if obj.is_valid():
        print('验证成功',obj.cleaned_data)
    else:
        print("验证失败",obj.errors)
    
    
    # ##################### HTML #####################
    for x in obj:
        print(x)
  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/zhongbokun/p/8529434.html
Copyright © 2011-2022 走看看