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)